上一节,我们简要的介绍了argparse的用法,接下来几节,将详细讲解其中的参数及用法,这一节我们讲解ArgumentParser对象。
argparse.ArgumentParser
([description][, epilog][, prog][, usage][, add_help][, argument_default][, parents][, prefix_chars][,conflict_handler][, formatter_class])
创建一个ArgumentParser对象。每个参数都有其特殊含义,简单的介绍如下:
-
-
description:help参数之前显示的信息
-
epilog:help参数之后显示的信息。
-
add_help:给解析器添加-h/--help选项(默认为True)
-
argument_default:设置参数的默认值(默认为None)
-
parents:ArgumentParser对象组成列表,这些对象中的参数也要包含进来。
-
prefix_chars:可选参数之前的前缀(默认为-)
-
fromfile_prefix_chars:如果是从文件中读取参数,这个文件名参数的前缀(默认为None)
-
formatter_class:一个自定义帮助信息格式化输出的类
-
conflict_handler:通常不需要,定义了处理冲突选项的策略
-
prog:程序名(默认为sys.argv[0])
-
usage:程序的使用用例,默认情况下会自动生成。
-
1.description
大多数调用ArgumentParser构造函数的例子中都会使用description参数,这个参数会简短的描述这个程序的用途。
>>> 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
默认情况下,这个描述信息前后都会有一个空行,如果想改变这种显示,可以使用formatter_class参数
2.epilog
有些程序可能想在描述信息之后再继续展示别的信息,这个时候可以使用epilog参数设置。
>>> parser = argparse.ArgumentParser( ... description='A foo that bars', ... epilog="And that's how you'd foo a bar") >>> parser.print_help() usage: argparse.py [-h] A foo that bars optional arguments: -h, --help show this help message and exit And that's how you'd foo a bar
跟description参数一样,这个信心前后都有一个空行,同样可以通过formatter-class参数设置。
3.add_help
默认情况下,ArgumentParser对象对自动添加-h/--help选项,以展示帮助信息。例如,myprogam.py代码如下所示:
import argparse parser = argparse.ArgumentParser() parser.add_argument('--foo', help='foo help') args = parser.parse_args()
如果命令行支持-h/--help参数,则下面的代码输出如下:
$ python myprogram.py --help usage: myprogram.py [-h] [--foo FOO] optional arguments: -h, --help show this help message and exit --foo FOO foo help
通过设置add_help=False可以取消帮助信息的显示
>>> parser = argparse.ArgumentParser(prog='PROG', add_help=False) >>> parser.add_argument('--foo', help='foo help') >>> parser.print_help() usage: PROG [--foo FOO] optional arguments: --foo FOO foo help
4.prefix_chars
大多数命令行参数使用-作为前缀,但是可以使用prefix_char=argument来自定义前缀。
>>> 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')
5.fromfile_prefix_chars
有时候需要从文件中获取参数,如果参数过多的话。这时,如果设置了fromfile_prefix_chars参数的话,解析器会将带有这个设定前缀的参数作为文件处理。
>>> with open('args.txt', 'w') as fp: ... fp.write('-f bar') >>> parser = argparse.ArgumentParser(fromfile_prefix_chars='@') >>> parser.add_argument('-f') >>> parser.parse_args(['-f', 'foo', '@args.txt']) Namespace(f='bar')
文件中必须是每行对应一个参数。
6.argument_default
设置参数的默认值。
>>> parser = argparse.ArgumentParser(argument_default=argparse.SUPPRESS) >>> parser.add_argument('--foo') >>> parser.add_argument('bar', nargs='?') >>> parser.parse_args(['--foo', '1', 'BAR']) Namespace(bar='BAR', foo='1') >>> parser.parse_args([]) Namespace()
7.parents
有时候,几个解析器共享一个参数集合,可以将这个共享参数集合传递给parent,解析器对象会将这些共享参数包含在内。
>>> parent_parser = argparse.ArgumentParser(add_help=False) >>> parent_parser.add_argument('--parent', type=int) >>> foo_parser = argparse.ArgumentParser(parents=[parent_parser]) >>> foo_parser.add_argument('foo') >>> foo_parser.parse_args(['--parent', '2', 'XXX']) Namespace(foo='XXX', parent=2) >>> bar_parser = argparse.ArgumentParser(parents=[parent_parser]) >>> bar_parser.add_argument('--bar') >>> bar_parser.parse_args(['--bar', 'YYY']) Namespace(bar='YYY', parent=None)
注意大多数情况下,父解析器会将add_help设置为False,否则将会出现两个-h/--help选项,从而导致错误。
8.formatter_class
通过指定formatter_class可以对帮助信息进行格式化输出。这样的类有三个:argparse.RawDescriptionHelpFormatter, argparse.RawTextHelpFormatter 以及argparse.ArgumentDefaultsHelp
默认情况下,description以及epilog信息前后都有一个空行。
>>> parser = argparse.ArgumentParser( ... prog='PROG', ... description='''this description ... was indented weird ... but that is okay''', ... epilog=''' ... likewise for this epilog whose whitespace will ... be cleaned up and whose words will be wrapped ... across a couple lines''') >>> parser.print_help() usage: PROG [-h] this description was indented weird but that is okay optional arguments: -h, --help show this help message and exit likewise for this epilog whose whitespace will be cleaned up and whose words will be wrapped across a couple lines
如果将formatter_class参数设置为argparse.RawDescriptionHelpFormatter,则description和epilog将会按原样输出。
>>> parser = argparse.ArgumentParser( ... prog='PROG', ... formatter_class=argparse.RawDescriptionHelpFormatter, ... description=textwrap.dedent(''' ... Please do not mess up this text! ... -------------------------------- ... I have indented it ... exactly the way ... I want it ... ''')) >>> parser.print_help() usage: PROG [-h] Please do not mess up this text! -------------------------------- I have indented it exactly the way I want it optional arguments: -h, --help show this help message and exit
RawTextHelpFormatter则会保留预定义的帮助信息中的空格。
另外一个类ArgumentDefaultsHelpFormatter
则会给所有的有默认值的参数添加默认值信息。
>>> parser = argparse.ArgumentParser( ... prog='PROG', ... formatter_class=argparse.ArgumentDefaultsHelpFormatter) >>> parser.add_argument('--foo', type=int, default=42, help='FOO!') >>> parser.add_argument('bar', nargs='*', default=[1, 2, 3], help='BAR!') >>> parser.print_help() usage: PROG [-h] [--foo FOO] [bar [bar ...]] positional arguments: bar BAR! (default: [1, 2, 3]) optional arguments: -h, --help show this help message and exit --foo FOO FOO! (default: 42)
9.conflict_handler
ArgumentParser对象不允许传入两个相同的参数,否则会报错。
>>> parser = argparse.ArgumentParser(prog='PROG') >>> parser.add_argument('-f', '--foo', help='old foo help') >>> parser.add_argument('--foo', help='new foo help') Traceback (most recent call last): .. ArgumentError: argument --foo: conflicting option string(s): --foo
通过设置conflict_handler为resolve,可以用新的参数覆盖旧的同名参数。
>>> parser = argparse.ArgumentParser(prog='PROG', conflict_handler='resolve') >>> parser.add_argument('-f', '--foo', help='old foo help') >>> parser.add_argument('--foo', help='new foo help') >>> parser.print_help() usage: PROG [-h] [-f FOO] [--foo FOO] optional arguments: -h, --help show this help message and exit -f FOO old foo help --foo FOO new foo help
10.prog
默认情况下,ArgumentParser对象使用sys.argv[0]来获取程序名。大多数情况下下,默认值就足够了,例如:
import argparse parser = argparse.ArgumentParser() parser.add_argument('--foo', help='foo help') args = parser.parse_args()
这种情况,帮助信息会如下所示:
$ python myprogram.py --help usage: myprogram.py [-h] [--foo FOO] optional arguments: -h, --help show this help message and exit --foo FOO foo help $ cd .. $ python subdirmyprogram.py --help usage: myprogram.py [-h] [--foo FOO] optional arguments: -h, --help show this help message and exit --foo FOO foo help
如果想改变这个默认值,可以设置prog。
>>> parser = argparse.ArgumentParser(prog='myprogram') >>> parser.print_help() usage: myprogram [-h] optional arguments: -h, --help show this help message and exit
11.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 ...] positional arguments: bar bar help optional arguments: -h, --help show this help message and exit --foo [FOO] foo help
这个默认的信息可以通过设置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] positional arguments: bar bar help optional arguments: -h, --help show this help message and exit --foo [FOO] foo help