argparse 模块用于构造用户友好的命令行接口。当我们在程序中定义运行所需要的参数后,argparse 可以指明如何解析sys.argv 中传递的这些参数,同时也可以在用户键入无效参数时提供帮助文档或错误提示。
用法:
prog - 在help信息中展现的程序名,默认是sys.argv[0],使用 ‘%(prog)s’ 可以将prog信息加入help信息;
usage - 默认情况下,usage 按照ArgumentParser对象包含的参数组织成字符串:
>>> parser = argparse.ArgumentParser(prog='PROG')
>>> parser.add_argument('--foo', nargs='?', help='foo help')
>>> parser.add_argument('bar', nargs='+', help='bar help')
>>> parser.print_help()
usage: PROG [-h] [--foo [FOO]] bar [bar ...]
但可以通过 usage 关键字参数重写:
>>> parser = argparse.ArgumentParser(prog='PROG', usage='%(prog)s [options]')
>>> parser.add_argument('--foo', nargs='?', help='foo help')
>>> parser.add_argument('bar', nargs='+', help='bar help')
>>> parser.print_help()
usage: PROG [options]
description-简述当前命令的功能与工作方式,在帮助信息中,展现在命令行usage信息与各个参数的帮助信息之间:
>>> parser = argparse.ArgumentParser(description='A foo that bars')
>>> parser.print_help()
usage: argparse.py [-h]
A foo that bars
optional arguments:
-h, --help show this help message and exit
prefix_chars-命令行参数默认用-作为前缀,需要其他前缀字符时,用prefix_chars标记:
>>> parser = argparse.ArgumentParser(prog='PROG', prefix_chars='-+')
>>> parser.add_argument('+f')
>>> parser.add_argument('++bar')
>>> parser.parse_args('+f X ++bar Y'.split())
Namespace(bar='Y', f='X')
from_prefix_chars-当命令行参数较长时,可以将参数保存在文件中,并将文件路径写在命令行内,这时需要from_prefix_chars标记出哪一个参数是文件:
>>> with open('args.txt', 'w') as fp:
... fp.write('-f\nbar')
>>> parser = argparse.ArgumentParser(fromfile_prefix_chars='@')
>>> parser.add_argument('-f')
>>> parser.parse_args(['-f', 'foo', '@args.txt'])
Namespace(f='bar')
allow_abbrev-默认情况下,parse_args()方法会键入命令行的参数名和ArgumentParser对象中保存的参数名匹配,即允许缩写:
>>> parser = argparse.ArgumentParser(prog='PROG')
>>> parser.add_argument('-bacon')
>>> parser.add_argument('-badger')
>>> parser.parse_args('-bac MMM'.split())
Namespace(bacon='MMM', badger=None)
>>> parser.parse_args('-bad WOOD'.split())
Namespace(bacon=None, badger='WOOD')
>>> parser.parse_args('-ba BA'.split())
usage: PROG [-h] [-bacon BACON] [-badger BADGER]
PROG: error: ambiguous option: -ba could match -badger, -bacon
当设置allow_abbrev=False时,必须键入完整的参数名:
>>> parser = argparse.ArgumentParser(prog='PROG', allow_abbrev=False)
>>> parser.add_argument('--foobar', action='store_true')
>>> parser.add_argument('--foonley', action='store_false')
>>> parser.parse_args(['--foon'])
usage: PROG [-h] [--foobar] [--foonley]
PROG: error: unrecognized arguments: --foon
add_help-ArgumentParse 对象默认会添加一个展现帮助信息的参数-h或–help,当设置add_help=False时,可以取消这一选择,一般定义父类解析器时需要设置,因为解析器中有两个相同的参数会导致ArgumentError。
其他参数如epilog、parents、formatter_class、conflict_handler等详见官方文档。
ArgumentParser.add_argument(name or flags…[, action][, nargs][, const][, default][, type][, choices][, required][, help][, metavar][, dest])
向ArgumentParser对象传递命令行参数的信息,定义用何种方式解析命令行中的参数。
name or flags 指出传递的关键字参数还是位置参数,可选参数前有前缀。调用parse_args()时,有前缀的参数被解析为可选参数,其余的解析为位置参数:
>>> parser = argparse.ArgumentParser(prog='PROG')
>>> parser.add_argument('-f', '--foo') # 定义一个可选参数
>>> parser.add_argument('bar') # 定义一个位置参数
>>> parser.parse_args(['BAR'])
Namespace(bar='BAR', foo=None)
>>> parser.parse_args(['BAR', '--foo', 'FOO']) # 按参数名又无前缀解析
Namespace(bar='BAR', foo='FOO')
>>> parser.parse_args(['--foo', 'FOO']) # 位置参数为必须项
usage: PROG [-h] [-f FOO] bar
PROG: error: the following arguments are required: bar
action 对命令行中参数的操作
store 默认方法,仅获取并存储参数的值:
>>> parser = argparse.ArgumentParser()
>>> parser.add_argument('--foo')
>>> parser.parse_args('--foo 1'.split())
Namespace(foo='1')
store_const 常用于可选参数,指定该参数的值,需要同时指定const值:
>>> parser = argparse.ArgumentParser()
>>> parser.add_argument('--foo', action='store_const', const=42)
>>> parser.parse_args(['--foo'])
Namespace(foo=42)
store_true、store_false 将参数的值存为True或False:
>>> parser = argparse.ArgumentParser()
>>> parser.add_argument('--foo', action='store_true')
>>> parser.add_argument('--bar', action='store_false')
>>> parser.add_argument('--baz', action='store_false')
>>> parser.parse_args('--foo --bar'.split())
Namespace(foo=True, bar=False, baz=True)
append 将参数的值存为列表:
>>> parser = argparse.ArgumentParser()
>>> parser.add_argument('--foo', action='append')
>>> parser.parse_args('--foo 1 --foo 2'.split())
Namespace(foo=['1', '2'])
append_const 设定这个属性值需要同时制定dest和const(默认为None),由此属性值的参数的值会存到名为dest的列表中:
>>> parser = argparse.ArgumentParser()
>>> parser.add_argument('--str', dest='types', action='append_const', const=str)
>>> parser.add_argument('--int', dest='types', action='append_const', const=int)
>>> parser.parse_args('--str --int'.split())
Namespace(types=[<class 'str'>, <class 'int'>])
nargs ArgumentParser对象通常将命令行中的参数和值一一对应,nargs可以更改参数对应的值的数量:
>>> parser = argparse.ArgumentParser()
>>> parser.add_argument('--foo', nargs=2)
>>> parser.add_argument('bar', nargs=1) # nargs=1 produces a list of one item
>>> parser.parse_args('c --foo a b'.split())
Namespace(bar=['c'], foo=['a', 'b'])
‘?’、‘*’、‘+’也可以作为nargs的值;
nargs赋值为 ‘*’ 时,所有参数的之都会被汇总金一个列表:
>>> parser = argparse.ArgumentParser()
>>> parser.add_argument('--foo', nargs='*')
>>> parser.add_argument('--bar', nargs='*')
>>> parser.add_argument('baz', nargs='*')
>>> parser.parse_args('a b --foo x y --bar 1 2'.split())
Namespace(bar=['1', '2'], baz=['a', 'b'], foo=['x', 'y'])
其他参数详见官方文档
当脚本中仅需要解析命令行中部分参数时,使用这个方法。当命令行中有多余的参数时,parse_known_args()方法返回两个元组,接受了数据的命名空间以及未使用的参数
>>> parser = argparse.ArgumentParser()
>>> parser.add_argument('--foo', action='store_true')
>>> parser.add_argument('bar')
>>> parser.parse_known_args(['--foo', '--badger', 'BAR', 'spam'])
(Namespace(bar='BAR', foo=True), ['--badger', 'spam'])