命令行解析工具argparse
argparse是python标准库中的模块,利用argparse,可以完成对命令行的参数定义、解析以及后续的处理。一个简单的例子:
# coding:utf-8 import argparse #定义解析器 parser = argparse.ArgumentParser() # 单-对外,--双-对内 # 添加参数 parser.add_argument('-v','--version',help="show version",action="store_true") #解析参数 args = parser.parse_args() #调用参数 if args.version: print("this is version: caesar-1.00")
action - 遇到参数时的动作,默认值是store。store_const,表示赋值为const;append,将遇到的值存储成列表,也就是如果参数重复则会保存多个值;
nargs - 参数的个数,可以是具体的数字,或者是?号,当不指定值时对于Positional argument使用default
default - 不指定参数时的默认值.
type - 参数的类型.
choices - 参数允许的值.
required - 可选参数是否可以省略(仅针对optionals).
help - 参数的帮助信息,当指定为argparse.SUPPRESS
时表示不显示该参数的帮助信息.
metavar - 在usage说明中的参数名称,对于必选参数默认就是参数名称,对于可选参数默认是全大写的参数名称.
dest - 解析后的参数名称,默认情况下,对于可选参数选取最长的名称,中划线转换为下划线
python-ceilometerclient
python-ceilometerclient的实现过程,如下:像版本信息、帮助信息、debug模式都在解析器中添加参数进行解析,而ceilometer sample-list、ceilometer query-samples 都会反射获取v2模块中do_sample_list、do_sample_querys 方法,构建sample-list、query-samples子解析器,添加参数sample-list、query-samples并关联对应方法。如此变可执行命令行调用v2包中的方法。
解析器的命令行[--version]版本查询,还支持<subcommand>输入命令。如本人写了个简单的实现,在v1中定义如下方法:
在命令行中调用,通过命令调用其中的打印方法:
其核心实现为子解析器添加方法名参数和关联反射所获取的方法 :具体可参考我的github: https://github.com/CaesarLinsa/ceilometer_TestCase
subparsers = parser.add_subparsers(metavar='<subcommand>') submodule = importutils.import_module('Test.cmd.api') for fn_names in (func for func in dir(submodule) if func.startswith('do_')): command = fn_names[3:].replace('_','-') callback = getattr(submodule,fn_names) desc = callback.__doc__ or '' help=desc.strip().split('\n')[0] arguments = getattr(callback,'arguments',[]) subparser = subparsers.add_parser(command, help=help, description=desc, add_help=False) subparser.add_argument('-h', '--help', action='help', help=argparse.SUPPRESS) self.subcommands[command] = subparser for (args, kwargs) in arguments: subparser.add_argument(*args, **kwargs) subparser.set_defaults(func=callback) return parser