• 关于cinderclient命令行解析


    一、简介

    openstack的各个模块中,都有相应的客户端模块实现,其作用是为用户访问具体模块提供了接口,并且也作为模块之间相互访问的途径。Cinder也一样,有着自己的cinder-client。

    二、argparse简单介绍

    argparse是python用于解析命令行参数和选项的标准模块,作为optparse的一个替代被添加到Python2.7。Cinder-client主要就是调用了argparse这个工具包。

    使用步骤:

    import argparse

    parser = argparse.ArgumentParser()

    parser.add_argument()

    parser.parse_args()

    首先导入该模块;然后创建一个解析对象;然后向该对象中添加你要关注的命令行参数和选项,每一个add_argument方法对应一个你要关注的参数或选项;最后调用parse_args()方法进行解析;解析成功之后即可使用。

    方法 ArgumentParser(prog=None, usage=None,description=None, epilog=None, parents=[],formatter_class=argparse.HelpFormatter, prefix_chars="-",fromfile_prefix_chars=None, argument_default=None,conflict_handler="error", add_help=True)

    这些参数都有默认值,当调用 parser.print_help()或者运行程序时,由于参数不正确(此时python解释器其实也是调用了pring_help()方法)时,会打印这些描述信息,一般只需要传递description参数

    方法add_argument(name or flags...[, action][, nargs][, const][, default][, type][, choices][, required][, help][, metavar][, dest])

    其中:

    name or flags:命令行参数名或者选项,如上面的address或者-p,--port.其中命令行参数如果没给定,且没有设置defualt,则出错。但是如果是选项的话,则设置为None。,parse_args()运行时,会用"-"来认证可选参数,剩下的即为位置参数

    nargs:命令行参数的个数,一般使用通配符表示,其中,"?"表示只用一个,"*"表示0到多个," "表示至少一个。nargs="*" 表示参数可设置零个或多个;nargs=" " " 表示参数可设置一个或多个;nargs="?"表示参数可设置零个或一个

    default:默认值。

    type:参数的类型,默认是字符串string类型,还有float、int等类型。

    help:和ArgumentParser方法中的参数作用相似,出现的场合也一致。

    dest:如果提供dest,例如dest="a",那么可以通过args.a访问该参数

    action:参数出发的动作

    store:保存参数,默认

    store_const:保存一个被定义为参数规格一部分的值(常量),而不是一个来自参数解析而来的值。

    store_ture/store_false:保存相应的布尔值

    append:将值保存在一个列表中。

    append_const:将一个定义在参数规格中的值(常量)保存在一个列表中。

    count:参数出现的次数

    parser.add_argument("-v", "--verbosity", action="count", default=0, help="increase output verbosity")

    version:打印程序版本信息

    choice:允许的参数值

    三、cinderclient代码入口查找

    第一种方式:D:\官网代码\python-cinderclient-stable-pike\setup.cfg[entry_points]console_scripts = cinder = cinderclient.shell:main第二种方式:[root@test bin]# pwd/usr/bin[root@test bin]# ls |grep cindercindercinder-allcinder-apicinder-backupcinder-managecinder-rootwrapcinder-rtstoolcinder-schedulercinder-volumecinder-volume-usage-audit[root@test bin]# cat cinder#!/usr/bin/python# PBR Generated from u"console_scripts"import sysfrom cinderclient.shell import mainif __name__ == "__main__": sys.exit(main())[root@test bin]#

    四、cinderclient代码分析

    D:\官网代码\python-cinderclient-stable-pike\cinderclient\shell.pydef main(): try: if sys.version_info >= (3, 0):-----sys.version获取python的版本,默认情况下, 使用系统自带的python版本,python2.6或者python 2.7 """ >>> print sys.version_info (2, 6, 6, "final", 0) >>> """ OpenStackCinderShell().main(sys.argv[1:])---sys.argv[1:],输入的cinder命令行,sys.argv[0]表示程序本身,sys.argv[1:]表示 输入的参数 else: OpenStackCinderShell().main([encodeutils.safe_decode(item)----走如下分支,步骤一 for item in sys.argv[1:]]) except KeyboardInterrupt: print("... terminating cinder client", file=sys.stderr) sys.exit(130) except Exception as e: logger.debug(e, exc_info=1) print("ERROR: %s" % six.text_type(e), file=sys.stderr) sys.exit(1)

    对步骤一进行详解

    from cinderclient import api_versionsfrom cinderclient import clientD:\官网代码\python-cinderclient-stable-pike\cinderclient\shell.pyclass OpenStackCinderShell(object): def __init__(self): self.ks_logger = None self.client_logger = None def main(self, argv): # Parse args once to find version and debug settings 解析args参数一次,查找version和debug设置信息 parser = self.get_base_parser() """ get_base_parser:获取基本的命令行解析器;调用

  • 相关阅读:
    容器化部署fastdfs文件存储
    windows flask 多进程高并发
    QTday03(信号与槽、对话框)
    [附源码]计算机毕业设计JAVA基于ssm的电子网上商城
    vue常用的命令
    git stash
    java计算机毕业设计共享顺风车管理系统源码+mysql数据库+系统+LW文档+部署
    Unity游戏Mod/插件制作教程03 - 插件实例1: HelloWorld
    OpenResty学习笔记03:再探WAF
    Selenium定位之find_element方法
  • 原文地址:https://blog.csdn.net/weixin_45707610/article/details/126486830