zoukankan      html  css  js  c++  java
  • python-ceilometerclient命令行(2)

    命令行解析工具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('
    ')[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
  • 相关阅读:
    elk工作原理
    nginx 引入外部文件
    3.1.2 视图实例演示-登录页面
    通信架构
    JAX-WS HandlerChain使用详解
    改变规则可以,前提是得有本事——北漂18年(64)
    An internal error occurred during:"Update Installed JREs".java.lang.NullPointerException
    jquery.mobile-1.4.5.min.js:3 Uncaught TypeError: Cannot set property 'mobile' of undefined
    大数据时代,百货行业信息化将如何变革?
    17.2?Replication Implementation 复制实施:
  • 原文地址:https://www.cnblogs.com/CaesarLinsa/p/9532145.html
Copyright © 2011-2022 走看看