李成石

导航

 

命令行解析工具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
posted on 2018-08-24 21:43  李成石  阅读(242)  评论(0编辑  收藏  举报