命令行参数

命令行参数

获取命令行参数

在C++中,应用程序的入口是mainmain函数采用如下声明方式时,传入的参数即为命令行参数:

int main(int argc,char** argv)

其中argc就是参数个数,argv是一个char*数组,保存了所有参数的字符串表示,其中第一个参数为应用程序名(包含完整路径)。

在Python中命令行参数保存在sys模块的argv列表中,与C++类似,第一个参数为脚本名(不包含路径),使用时需要导入sys模块,譬如:

import sys
print(sys.argv)
  • C++输出应用程序名、显示参数个数及内容
#include <iostream>

int main(int argc, char** argv) {
    std::cout<<"This is the name of the application:"<<argv[0]<<std::endl;
    std::cout<<"Number of arguments:"<<argc<<std::endl;

    std::cout<<"The arguments are:"<<std::endl;
    for (int i = 0; i < argc; i++) {
        std::cout<<"\t["<<argv[i]<<"]\n";
    }
    return 0;
}
  • Python输出脚本名、显示参数个数及内容
import sys

print('This is the name of the script:',sys.argv[0])
print('Number of arguments:',len(sys.argv))
print('The arguments are:',str(sys.argv))

解析命令行选项

在编写命令行程序时,需要接收命令行输入将其解析为对应选项,来进行相关操作,譬如一个基于命令行的压缩解压工具,当用户输入--help时需要打印出帮助信息,使用--compression 1时需要将压缩等级设置为1等等。

C++中没有标准库来解析命令行选项,但是有第三方库可以使用,譬如Boost中的Boost.Program_options;Python的标准库模块optparse可以用来解析命令行选项。

C++ Boost.Program_options的使用

该库将命令行选项解析分解为三部分内容:选项描述、解析、存储,在使用时首选描述支持的选项,然后根据命令行参数、选项描述、选项结果存储进行解析,譬如以下示例,展示了两个选项--help--compression:

#include <iostream>
#include <boost\program_options.hpp>

namespace po = boost::program_options;

int main(int argc, char** argv) {
    //选项描述
    po::options_description desc("Allowed options");
    desc.add_options()
        ("help","produce help message")
        ("compression",po::value<int>(),"set compression level")
    ;

    //存储
    po::variables_map vm;
    //解析
    po::store(po::parse_command_line(argc,argv,desc),vm);
    po::notify(vm);

    //使用
    if (vm.count("help")) {
        std::cout<<desc<<"\n";
        return 1;
    }

    if (vm.count("compression")) {
        std::cout<<"Compression level was set to "<<vm["compression"].as<int>()<<".\n";
    }
    else {
        std::cout<<"Compression level was not set.\n";
    }
    return 0;
}

该库可以指定选项的默认值、选项的类型、解析方法等,譬如以下示例:

    int opt;
    po::options_description desc("Allowed options");
    desc.add_options()
        ("help","produce help message")
        ("optimization",po::value<int>(&opt)->default_value(10),"optimization level")//默认值
        ("include-path,I",po::value<std::vector<std::string>>(),"include path") //字符串数组
        ("input-file",po::value<std::vector<std::string>>(),"input file")
    ;

    po::variables_map vm;
    po::store(po::parse_command_line(argc, argv, desc), vm);
    po::notify(vm);

该库还支持从配置文件加载选项,多个选项组等,具体参考文档。

Python optparse的使用

optparse使用起来相对简单一点,只需要导入库,创建OptionParser实例,然后添加选项,直接解析即可得到选项,譬如以下示例:

from optparse import OptionParser #导入库

parser = OptionParser() #创建实例
parser.add_option("-f", "--file", dest="filename",
                  help="write report to FILE", metavar="FILE")
parser.add_option("-q", "--quiet",
                  action="store_false", dest="verbose", default=True,
                  help="don't print status messages to stdout")

(options, args) = parser.parse_args()

可以得到结果为:

Usage: <yourscript> [options]

Options:
  -h, --help            show this help message and exit
  -f FILE, --file=FILE  write report to FILE
  -q, --quiet           don't print status messages to stdout

选项声明的语法为parser.add_option(opt_str,...,attr=value,...),并且每个选项都有一个短选项标识和长选项标识,譬如上述示例中的-f--file,解析完成之后结果会存储在optionsargs中,其中选项指定的target用来获取对应选项值,譬如上述示例的-f选项结果为options.filename,而剩下的positional参数都会存储在args中。

选项有几种解析后行为,默认为store存储,对于布尔值选项则有store_truestore_false,还有其它行为:

  • store_const 保存为常量
  • append 追加
  • count 递增计数
  • callback 执行回调

选项组为OptionGroup,可以向选项组添加选项,然后parser添加选项组,使用示例如下:

group = OptionGroup(parser, "Dangerous Options",
                    "Caution: use these options at your own risk.  "
                    "It is believed that some of them bite.")
group.add_option("-g", action="store_true", help="Group option.")
parser.add_option_group(group)

Python3.2之后的命令行选项解析模块argparse

从Python3.2之后,原有的optparse模块被废弃,并引入了新的模块argparse,命令行选项解析库使用上概念一致,大同小异,具体内容参考文档。

最后编辑于
©著作权归作者所有,转载或内容合作请联系作者
平台声明:文章内容(如有图片或视频亦包括在内)由作者上传并发布,文章内容仅代表作者本人观点,简书系信息发布平台,仅提供信息存储服务。

推荐阅读更多精彩内容

  • sys.argv sys.argv[0]是脚本文件的名字,如:test.py sys.argv[1:]是以空格分割...
    f9f73935e28c阅读 21,176评论 0 0
  • Spring Cloud为开发人员提供了快速构建分布式系统中一些常见模式的工具(例如配置管理,服务发现,断路器,智...
    卡卡罗2017阅读 134,987评论 19 139
  • linux资料总章2.1 1.0写的不好抱歉 但是2.0已经改了很多 但是错误还是无法避免 以后资料会慢慢更新 大...
    数据革命阅读 12,239评论 2 33
  • 我们在写一个可变性比较大的脚本时候,很多情况下我们需要传入很多个不同的参数,就像我们在终端输入pip --help...
    迷路的南南见鸟阅读 1,834评论 0 0
  • 无意间逛微博,看到一条推送,那是一个女孩讲述她暗恋学长7年,却一直没有说出口,等她再次想起他,想告诉他时,他...
    解忧小屋阅读 250评论 0 0