python之argparse命令行选项与参数解析

python之argparse命令行选项与参数解析

argparse 是 Python 内置的一个用于命令项选项与参数解析的模块,通过在程序中定义好我们需要的参数,argparse 将会从 sys.argv 中解析出这些参数,并自动生成帮助和使用信息。当然,Python 也有第三方的库可用于命令行解析,而且功能也更加强大,比如 docoptClick

Argparse使用方法

创建 ArgumentParser() 对象

1
ArgumentParser(prog=None, usage=None, description=None, epilog=None)
  • prog(不建议更改)
    程序名称(默认sys.argv[0],默认为函数文件名),设置prog则改变这一默认。假设在 example.py 里用了 ArguemntParser ,而且没有特别指定 prog ( None), prog 会被自动指定成example.py

  • usage(不建议更改)

    用于描述程序的使用用法(默认为添加到解析器中的参数)。在使用python xxx.py -h之后将出现。保持 None 会自动根据设定的参数产生相对应的说明字串。

  • description

    字串,通常是一段简短的说明,告知使用者该程序的用途。

  • epilog

    字串,出现在参数说明字串的最后,通常是一些补充资料。

可通过以下代码查看具体情形

1
2
3
4
5
6
7
8
9
10
11
12
# example.py
from argparse import ArgumentParser
parser1 = ArgumentParser()
parser2 = ArgumentParser(prog="my_example")
parser3 = ArgumentParser(usage="usage")
parser4 = ArgumentParser(description="a simple demo of argparse")
parser5 = ArgumentParser(epilog="see the doc: https://docs.python.org/3/library/argparse.html")
parser1.print_help()
parser2.print_help()
parser3.print_help()
parser4.print_help()
parser5.print_help()

调用 add_argument() 方法添加参数

1
ArgumentParser.add_argument(name or flags...[, action][, nargs][, const][, default][, type][, choices][, required][, help][, metavar][, dest])
  • name or flags - 选项字符串的名字或者列表,例如 foo 或者 -f, –foo。
  • action - 命令行遇到参数时的动作,默认值是 store。
    • store_const,表示赋值为const;
    • append,将遇到的值存储成列表,也就是如果参数重复则会保存多个值;
    • append_const,将参数规范中定义的一个值保存到一个列表;
    • count,存储遇到的次数;此外,也可以继承 argparse.Action 自定义参数解析;
  • nargs - 应该读取的命令行参数个数,可以是具体的数字,或者是?号,当不指定值时对于 Positional argument 使用 default,对于 Optional argument 使用 const;或者是 * 号,表示 0 或多个参数;或者是 + 号表示 1 或多个参数。
  • const - action 和 nargs 所需要的常量值。
  • default - 不指定参数时的默认值。
  • type - 命令行参数应该被转换成的类型。
  • choices - 参数可允许的值的一个容器。
  • required - 可选参数是否可以省略 (仅针对可选参数)。
  • help - 参数的帮助信息,当指定为 argparse.SUPPRESS 时表示不显示该参数的帮助信息.
  • metavar - 在 usage 说明中的参数名称,对于必选参数默认就是参数名称,对于可选参数默认是全大写的参数名称.
  • dest - 解析后的参数名称,默认情况下,对于可选参数选取最长的名称,中划线转换为下划线.

互斥参数

另外介绍下互斥参数的设置

1
2
3
group = parser.add_mutually_exclusive_group() 
group.add_argument("-v", "--verbose", action="store_true")
group.add_argument("-q", "--quiet", action="store_true")

第一行定义了一个互斥组,第二、三行在互斥组中添加了-v-q两个参数,-q-v不出现,或仅出现一个都可以,同时出现就会报错。

使用 parse_args() 解析添加的参数

一旦参数选项被指定,你就可以执行 parse_args()方法了。 它会处理 sys.argv 的值并返回一个结果实例。 每个参数值会被设置成该实例中add_argument() 方法的dest 参数指定的属性值。

实例代码

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
import sys
import argparse


def person():
args = argparse.ArgumentParser(description='Personal Information ', epilog='Information end ')
# 必写属性,第一位
args.add_argument("name", type=str, help="Your name")
# 必写属性,第二位
args.add_argument("birth", type=str, help="birthday")
# 可选属性,默认为None
args.add_argument("-r", '--race', type=str, dest="race", help=u"民族")
# 可选属性,默认为0,范围必须在0~150
args.add_argument("-a", "--age", type=int, dest="age", help="Your age", default=0, choices=range(150))
# 可选属性,默认为male
args.add_argument('-s', "--sex", type=str, dest="sex", help='Your sex', default='male', choices=['male', 'female'])
# 可选属性,默认为None,-p后可接多个参数
args.add_argument("-p", "--parent", type=str, dest='parent', help="Your parent", default="None", nargs='*')
# 可选属性,默认为None,-o后可接多个参数
args.add_argument("-o", "--other", type=str, dest='other', help="other Information", required=False, nargs='*')

args = args.parse_args() # 返回一个命名空间,如果想要使用变量,可用args.attr
print("argparse.args=", args, type(args))
print('name = ', args.name)
d = args.__dict__
for key, value in d.items():
print('{} = {}'.format(key, value))


if __name__ == '__main__':
person()

使用如下参数运行

1
python argv_argparse.py Jame 1991.11.11 -p Harden John -a 25 -r han -s male -o 1 2 3 4 5 6

结果如下:

argparse.args= Namespace(age=25, birth=’1991.11.11’, name=’Jame’, other=[‘1’, ‘2’, ‘3’, ‘4’, ‘5’, ‘6’], parent=[‘Harden’, ‘John’], race=’han’, sex=’male’)
name = Jame
name = Jame
birth = 1991.11.11
race = han
age = 25
sex = male
parent = [‘Harden’, ‘John’]
other = [‘1’, ‘2’, ‘3’, ‘4’, ‘5’, ‘6’]

参考

极客学院 argparse

argparse - 命令行选项与参数解析

Python-argparse-命令行与参数解析

Python 超好用標準函式庫 argparse