命令行参数
获取命令行参数
在C++中,应用程序的入口是main
,main
函数采用如下声明方式时,传入的参数即为命令行参数:
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
,解析完成之后结果会存储在options
和args
中,其中选项指定的target
用来获取对应选项值,譬如上述示例的-f
选项结果为options.filename
,而剩下的positional参数都会存储在args
中。
选项有几种解析后行为,默认为store
存储,对于布尔值选项则有store_true
和store_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,命令行选项解析库使用上概念一致,大同小异,具体内容参考文档。