美文网首页
命令行参数

命令行参数

作者: 长不胖的Garfield | 来源:发表于2017-05-03 16:28 被阅读0次

命令行参数

获取命令行参数

在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,命令行选项解析库使用上概念一致,大同小异,具体内容参考文档。

相关文章

  • 九、处理用户输入

    简单目录 1.命令行参数 2.处理命令行选项和命令行参数参数 3.read命令获取用户输入 1.命令行参数 在命令...

  • 常用的npm包

    命令行参数处理 nodejs 脚本,命令行参数处理,接受参数parse 可以使用 minimist 参数提示 co...

  • 特殊变量列表

    特殊变量列表 命令行参数 运行脚本时传递给脚本的参数称为命令行参数。命令行参数用 $n 表示,例如,$1 表示第一...

  • Java 命令行参数解析类库

    命令行参数解析类库1命令行参数解析类库2命令行参数解析类库3 JArgsJakarta Commons CLITE...

  • pflag命令行参数

    简介 本文讲解如何在go程序中使用命令行参数包pflag来获取gong语言编写的命令行程序的传入参数。 命令行参数...

  • 第14章:处理用户输入

    [TOC] #1. 命令行参数 向shell脚本传递数据的最基本方法是使用命令行参数。命令行参数允许在运行脚本时向...

  • flag

    编写命令行程序时会使用不同的启动参数(命令行参数)来控制程序的行为 Go编写命令行程序时,获取并解析命令行参数的方...

  • 2.2.7 shell位置参数与特殊变量

    命令行参数

  • shell环境变量一览

    变量说明*含有所有命令行参数(以单个文本值的形式)@含有所有命令行参数(以多个文本值的形式)#命令行参数数目?最近...

  • 比特股命令行钱包cli_wallet参数翻译

    一 命令行参数

网友评论

      本文标题:命令行参数

      本文链接:https://www.haomeiwen.com/subject/iyxltxtx.html