# argparse 使用方式 ```python import argparse parser = argparse.ArgumentParser(description="xxx") parser.add_argument('-i', '--image', default='', help='') args = parser.parse_args() ``` ## 配置实例 ```python import argparse parser = argparse.ArgumentParser(description="xxx") parser.add_argument("-v", "--version", action="version", version="mt version: v0.1.0", help="Show the mt algorithm version.") parser.add_argument("-d", "--debug", action="store_true", default=False, help="") args = parser.parse_args() #说明 store_true: 一旦指定了 -d 或者 --debug ,其值就为 True,store_false则相反. default=False:未指定 -d 或者 --debug,其值就默认为False ``` > **add_argument()常用的参数:** > > - dest:如果提供dest,例如dest="a",那么可以通过args.a访问该参数 > - default:设置参数的默认值 > - 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:打印程序版本信息 > - type:把从命令行输入的结果转成设置的类型 > - choice:允许的参数值 > - parser.add_argument("-v", "--verbosity", type=int, choices=[0, 1, 2], help="increase output verbosity") > - help:参数命令的介绍 ------ # 2. 参数种类 参数可分为 必选参数(positional arguments) 和 可选参数(optional arguments)。 在argsparse 里如何实现呢? ## **必选参数** 用单词做参数,默认就为必选参数 ```python # mytest.py import argparse parser = argparse.ArgumentParser() parser.add_argument("name") args = parser.parse_args() print(args.name) ``` 不指定name参数运行一下:`python mytest.py` ```ruby [root@localhost ~]# python mytest.py usage: mytest.py [-h] name mytest.py: error: too few arguments [root@localhost ~]# ``` 如预期一样,报错了,说缺少参数。那我们指定一下:`python mytest.py name wangbm` ```ruby [root@localhost ~]# python mytest.py wangbm wangbm [root@localhost ~]# ``` ## **可选参数** 有两种方式: 1. 单下划线 - 来指定的短参数,如`-h`; 2. 双下划线 `--` 来指定的长参数,如`--help` ```python # mytest.py import argparse parser = argparse.ArgumentParser() parser.add_argument("-v", "--verbosity", help="increase output verbosity") args = parser.parse_args() if args.verbosity: print("verbosity turned on") else: print("verbosity turned off") ``` 试着运行一下 `python mytest.py`,不会报错。 ```coffeescript [root@localhost ~]# python mytest.py verbosity turned off [root@localhost ~]# ``` # 3. 参数类型 有的参数,是字符串,有的参数,是数值。 为了对命令行中的参数进行有效的约束,我们可以事先对参数的类型进行声明。argparse 会对参数进行校验,不通过时,会直接抛出错误。 ```python # mytest.py import argparse parser = argparse.ArgumentParser() parser.add_argument("name") parser.add_argument("age", type=int) args = parser.parse_args() print(args.name) print(args.age) ``` 测试一下。 ```csharp [root@localhost ~]# python mytest.py wangbm eighteen usage: mytest.py [-h] name age mytest.py: error: argument age: invalid int value: 'eighteen' [root@localhost ~]# [root@localhost ~]# python mytest.py wangbm 18 wangbm 18 [root@localhost ~]# ``` 你看,写 `eighteen` 就不行,提示类型不合法,只有写 `18` 才行。 # 4. 互斥参数 有些参数,是互斥的,有你无我。比如,性别。 在 argparse 中如何实现? ```python import argparse parser = argparse.ArgumentParser() group = parser.add_mutually_exclusive_group() group.add_argument("-m", "--male", action="store_true") group.add_argument("-f", "--female", action="store_true") args = parser.parse_args() ``` 如果同时指定了这两个参数,就会报错。 ```csharp [root@localhost ~]# python mytest.py -f [root@localhost ~]# python mytest.py -m [root@localhost ~]# python mytest.py -m -f usage: mytest.py [-h] [-m | -f] mytest.py: error: argument -f/--female: not allowed with argument -m/--male [root@localhost ~]# ``` # 5. 可选值 如果是性别,可以像上面那样放在两个参数里然后用互斥组来约束,也可以放在一个参数里,在argparse里限制再在外层做判断。 ```python # mytest.py import argparse parser = argparse.ArgumentParser() parser.add_argument("-g", "--gender", default='male', choices=['male', 'female']) args = parser.parse_args() print(args.gender) ``` 试着执行一下,发现性别只能是男或女,不能为人妖。 ```csharp [root@localhost ~]# python mytest.py --gender male male [root@localhost ~]# python mytest.py --gender female female [root@localhost ~]# [root@localhost ~]# [root@localhost ~]# python mytest.py --gender other usage: mytest.py [-h] [-g {male,female}] mytest.py: error: argument -g/--gender: invalid choice: 'other' (choose from 'male', 'female') [root@localhost ~]# ``` # 6. 指定文件 经常会有那种要在脚本中指定配置文件或者其他文件的需求。可以使用下面的配置 ```python import argparse parser = argparse.ArgumentParser() parser.add_argument('--file', '-f', action='append', dest='files', help=('additional yaml configuration files to use'), type=argparse.FileType('rb')) args = parser.parse_args() ``` `dest=files`,是说将命令行中,`--file` 的参数值赋值给变量files,你可以用args.files访问。 `action=append`,由于我们会有指定多个文件的需求,那就指定多次`--file` ,argparse会将其放在一个list里。 ``` type=argparse.FileType('rb')`,既然是指定文件,那么参数应该为路径,并指定打开模式为rb,如果如果要取得文件内容,可以用 `args.files[0].read() ``` # 7. 子解析器 如果你对命令行,有过足够多的接触,就会知道有些情况下会有子解析器。 这里我以自己工作中,碰到的例子来举个例子。 ```csharp cloud-init --debug single -name mymodule ``` 其中 single 后面是一个子解析器。 ```python # cloud-init.py def main_single(name, args): print("name: ", name) print("args: ", args) print("I am main_single") # 添加一个子解析器 subparsers = parser.add_subparsers() parser_single = subparsers.add_parser('single',help='run a single module') # 对single 子解析器添加 action 函数。 parser_single.set_defaults(action=('single', main_single)) # require=True,是说如果命令行指定了single解析器,就必须带上 --name 的参数。 parser_single.add_argument("--name", '-n', action="store", help="module name to run", required=True) args = parser.parse_args() (name, functor) = args.action if name in ["single"]: functor(name, args) ``` 执行命令`cloud-init single -name mymodule`,输出如下 ``` name: single args: Namespace(action=('single', ), debug=False, file=None, name='mymodule') I am main_single ```