argparse,Python内置的命令行解析器

版权声明:本文为博主原创文章,遵循 CC 4.0 BY-SA 版权协议,转载请附上原文出处链接和本声明。
本文链接: https://blog.csdn.net/JosephThatwho/article/details/101350783

argparse: 命令行中选项、参数以及子命令的解析器

argparse 模块用于构造用户友好的命令行接口。当我们在程序中定义运行所需要的参数后,argparse 可以指明如何解析sys.argv 中传递的这些参数,同时也可以在用户键入无效参数时提供帮助文档或错误提示。
用法:

  1. 首先创建一个解析器
    要将命令行解析为执行python文件所需要的Python数据类型显然要用到一些信息,这些信息将包含在ArgumentParser对象中
  2. 添加参数
    add_argument()方法将解析器需要的信息填充给解析器,解析器将根据这些信息提取命令行中的字符串并转换为相应的对象。
  3. 解析参数
    parse_args()方法将根据第二步填充的信息检查命令行,将命令行中的参数转换为合适的类型并调用适当的方法。
1. 实例化ArgumentParser对象时可传的参数(部分)

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。
其他参数如epilogparentsformatter_classconflict_handler等详见官方文档

2. add_argument()方法

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_truestore_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()方法

当脚本中仅需要解析命令行中部分参数时,使用这个方法。当命令行中有多余的参数时,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'])

猜你喜欢

转载自blog.csdn.net/JosephThatwho/article/details/101350783
今日推荐