argparse是Python中的一个常用模块,和sys.argv()功能类似,主要用于编写命令行接口:对于程序所需要的参数,它可以进行正确的解析。另外,argparse还可以自动的生成help
和 usage
信息,当程序的参数无效时,它可以自动生成错误信息。
[参考文档]:https://docs.python.org/3/library/argparse.html
下列代码是python程序,它可以接受多个整数,并返回它们的和或者最大值。
import argparse
parser = argparse.ArgumentParser(description='Process some integers.')
parser.add_argument('integers', metavar='N', type=int, nargs='+',
help='an integer for the accumulator')
parser.add_argument('--sum', dest='accumulate', action='store_const',
const=sum, default=max,
help='sum the integers (default: find the max)')
args = parser.parse_args()
print(args.accumulate(args.integers))
假定上述代码保存为prog.py,它可以在命令行执行并自动提供有用的help
信息:
$ python prog.py -h
usage: prog.py [-h] [--sum] N [N ...]
Process some integers.
positional arguments:
N an integer for the accumulator
optional arguments:
-h, --help show this help message and exit
--sum sum the integers (default: find the max)
该程序可以接受相应的参数并给出相应的输出:
$ python prog.py 1 2 3 4
4
$ python prog.py 1 2 3 4 --sum
10
如果传入无效的参数,它可以自动生成error
信息:
$ python prog.py a b c
usage: prog.py [-h] [--sum] N [N ...]
prog.py: error: argument N: invalid int value: 'a'
使用argparse的第一步是创建ArgumentParser对象
parser = argparse.ArgumentParser(description='Process some integers.')
ArgumentParser对象保存了所有必要的信息,用以将命令行参数解析为相应的python
数据类型。
调用add_argument()向ArgumentParser对象添加命令行参数信息,这些信息告诉ArgumentParser对象如何处理命令行参数。可以通过调用parse_agrs()来使用这些命令行参数。例如:
parser.add_argument('integers', metavar='N', type=int, nargs='+',
help='an integer for the accumulator')
parser.add_argument('--sum', dest='accumulate', action='store_const',
const=sum, default=max,
help='sum the integers (default: find the max)')
之后,调用parse.args()将返回一个对象,它具有两个属性:integers
和accumulate
,前者是一个整数集合,后者根据命令行参数的不同,代表不同的函数,可以是max(),也可以是sum()。
通过调用parse_args()来解析ArgumentParser对象中保存的命令行参数:将命令行参数解析成相应的数据类型并采取相应的动作,它返回一个Namespace
对象。
$ parser.parse_args(['--sum', '7', '-1', '42'])
Namespace(accumulate=in function sum>, integers=[7, -1, 42])
在实际的python
脚本中,parse_args()一般并不使用参数,它的参数由sys.argv
决定。
class argparse.ArgumentParser(prog=None,
usage=None,
description=None,
epilog=None,
parents=[],
formatter_class=argparse.HelpFormatter,
argument_default=None,
conflict_handler=’error’,
add_help=True,
allow_abbrev=True)
help
信息的说明格式 help
选项默认情况下,ArgumentParser对象使用sys.argv[0]来决定如何在help
信息中显示程序的文件名。
例如:下列代码的文件名为myprogram.py
import argparse
parser = argparse.ArgumentParser()
parser.add_argument('--foo', help='foo help')
args = parser.parse_args()
它的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
$ cd ..
$ python subdir/myprogram.py --help
usage: myprogram.py [-h] [--foo FOO]
optional arguments:
-h, --help show this help message and exit
--foo FOO foo help
使用prog参数可以修改ArgumentParser对象的默认文件名:
$parser = argparse.ArgumentParser(prog='myprogram')
$ parser.print_help()
usage: myprogram [-h]
optional arguments:
-h, --help show this help message and exit
不论程序的文件名是来自sys.argv[0],不是来自参数prog,都可以通过%(prog)s来引用程序的文件名。
$ parser = argparse.ArgumentParser(prog='myprogram')
$ parser.add_argument('--foo', help='foo of the %(prog)s program')
$ parser.print_help()
usage: myprogram [-h] [--foo FOO]
optional arguments:
-h, --help show this help message and exit
--foo FOO foo of the myprogram program
默认情况下,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
一般情况下,ArgumentParser对象会使用参数description来说明程序的用途以及目的。description
信息一般位于usage
信息和help
信息之间。
$ 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
默认情况下,description
会自动调整间距来适应显示空间。可以通过formatter_class
类来修改它的显示方式。
一些程序喜欢在参数描述信息之后添加额外的信息,这些信息可以通过参数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
类似,epilog
会自动调整间距来适应显示空间。可以通过formatter_class
类来修改它的显示方式。
有时候,parsers会共享很多参数,为了避免参数的重复定义,可以定义一个包涵共享参数的parent_parser。当定义需要共享参数的ArgumentParser对象child_parser时,可以通过参数parent把共享参数传递给child_parser,只需要ArgumentParser对象的参数parent=[parent_parser]即可。注意,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)
注意,当使用参数parent是,父对象的参数add_help要设置为False,否则,ArgumentParser对象会生成两个-h/--help
选项,从而出错。
注意,在通过参数parent进行传递之前,parent_parser必须显示初始化。另外,传递结束之后,任何对父对象的修改都不会影响子对象的值。
参数formatter_class不常用,因此没翻译此部分。
ArgumentParser objects allow the help formatting to be customized by specifying an alternate formatting class. Currently, there are four such classes:
class argparse.RawDescriptionHelpFormatter
class argparse.RawTextHelpFormatter
class argparse.ArgumentDefaultsHelpFormatter
class argparse.MetavarTypeHelpFormatter
RawDescriptionHelpFormatter and RawTextHelpFormatter give more control over how textual descriptions are displayed. By default, ArgumentParser objects line-wrap the description and epilog texts in command-line help messages:
$ 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
Passing RawDescriptionHelpFormatter as formatter_class= indicates that description and epilog are already correctly formatted and should not be line-wrapped:
$ 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 maintains whitespace for all sorts of help text, including argument descriptions. However, multiple new lines are replaced with one. If you wish to preserve multiple blank lines, add spaces between the newlines.
ArgumentDefaultsHelpFormatter automatically adds information about default values to each of the argument help messages:
$ 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)
MetavarTypeHelpFormatter uses the name of the type argument for each argument as the display name for its values (rather than using the dest as the regular formatter does):
$ parser = argparse.ArgumentParser(
... prog='PROG',
... formatter_class=argparse.MetavarTypeHelpFormatter)
$ parser.add_argument('--foo', type=int)
$ parser.add_argument('bar', type=float)
$ parser.print_help()
usage: PROG [-h] [--foo int] float
positional arguments:
float
optional arguments:
-h, --help show this help message and exit
--foo int
大部分命令行参数选项使用-
作为前缀,例如: -f/–foo. 可以通过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')
默认情况下使用-
作为前缀,当使用其它字符作为前缀后,-
将被作为一个普通字符,以-
开头的字符串也不会被认为是参数选项,而是普通的字符串。
一般情况下,命令行参数是通过命令行直接输入的,也可以将它们存储在某个文件中,然后从文件中读取。在这种情况下,就需要定义存储参数值的文件的前缀引导符。例如:
$ 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')
注意,命令行参数在文件中的保存格式和它们的命令行直接输入的顺序保持一致。例如: [‘-f’, ‘foo’, ‘@args.txt’]和[‘-f’, ‘foo’, ‘-f’, ‘bar’]等价。
参数fromfile_prefix_chars默认为None,意味着直接在命令行进行输入。
一般情况下,参数的默认值通过add_argument()方法或者set_default()方法来设定。有时候,我们可以通过参数argument_default设定ArgumentParser对象级别的默认值。例如,当argument_default=argparse.SUPPERSS时,调用parse_args()并不会生成相应的属性。
$ 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()
当命令行参数字符串比较长时,可以通过指定allow_abbrev=True来使用长字符串参数的缩写进行参数引用。
注意,缩写形式有时候会遇到名称冲突,即两个不同的参数的缩写一样。
$ 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
参数confict_handler一般不使用,所以暂未翻译。
ArgumentParser objects do not allow two actions with the same option string. By default, ArgumentParser objects raise an exception if an attempt is made to create an argument with an option string that is already in use:
$ 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
Sometimes (e.g. when using parents) it may be useful to simply override any older arguments with the same option string. To get this behavior, the value 'resolve' can be supplied to the conflict_handler= argument of ArgumentParser:
$
$ 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
Note that ArgumentParser objects only remove an action if all of its option strings are overridden. So, in the example above, the old -f/–foo action is retained as the -f action, because only the –foo option string was overridden.
默认情况下,ArgumentParser对象会自动生成-h/--help
选项。
例如上面的myprogram.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
注意:帮助选项默认是使用-
前缀,当prefix_chars设定为别的字符是,帮选项同样使用prefix_chars做为前缀。例如:
$ parser = argparse.ArgumentParser(prog='PROG', prefix_chars='+/')
$ parser.print_help()
usage: PROG [+h]
optional arguments:
+h, ++help show this help message and exit
ArgumentParser.add_argument(name or flags…[, action][, nargs][, const][, default][, type][, choices][, required][, help][, metavar][, dest])
通过add-argument()方法来给ArgumentParser对象添加新的命令行参数,参数的类型和相应的处理方法由不同的参数决定。
-
的为可选参数(optional parameter)-
的为必选参数(positional parametrer)。 usage
中的名称 必选参数名或者可选参数标识符,它必须作为add_argument()方法的第一个参数。
# 可选参数
$ parser.add_argument('-f', '--foo')
# 必选参数
$ parser.add_argument('bar')
可选参数默认以-
开始,其它的为必选参数。
$ 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: too few arguments
ArgumentParser对象将命令行参数与动作联系在一起,这些动作可以对命令行参数进行适当的处理,最常用的动作就是在parse_args()返回的对象中添加一个属性。参数action说明了命令行参数应该如何被处理。
‘store’ - 存储参数的值。即在parser_args()方法返回的Namespace对象中添加属性,并设定它的值。它是action的默认值。
$ 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’ and ‘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’ - 将命令行参数的值设定为一个列表,列表中的每个值都来自参数const的取值。
$ 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'>])
‘count’ - 命令行参数的出现次数。
$ parser = argparse.ArgumentParser()
$ parser.add_argument('--verbose', '-v', action='count')
$ parser.parse_args(['-vvv'])
Namespace(verbose=3)
‘help’ - 命令行参数的帮助信息。
‘version’ - 和参数version用来说明相应的版本信息。
$ import argparse
$ parser = argparse.ArgumentParser(prog='PROG')
$ parser.add_argument('--version', action='version', version='%(prog)s 2.0')
$ parser.parse_args(['--version'])
PROG 2.0
可以新建一个类,来实现任何别的动作。最常用的方法是通过Action类生成一个子类,然后重写它的call方法和init方法。
$ class FooAction(argparse.Action):
... def __init__(self, option_strings, dest, nargs=None, **kwargs):
... if nargs is not None:
... raise ValueError("nargs not allowed")
... super(FooAction, self).__init__(option_strings, dest, **kwargs)
... def __call__(self, parser, namespace, values, option_string=None):
... print('%r %r %r' % (namespace, values, option_string))
... setattr(namespace, self.dest, values)
...
$ parser = argparse.ArgumentParser()
$ parser.add_argument('--foo', action=FooAction)
$ parser.add_argument('bar', action=FooAction)
$ args = parser.parse_args('1 --foo 2'.split())
Namespace(bar=None, foo=None) '1' None
Namespace(bar='1', foo=None) '2' '--foo'
$ args
Namespace(bar='1', foo='2')
这个使用也不多,暂时不翻译了。
一般情况下,每个命令行参数只与一个动作相联系,参数nargs可以让多个参数与一个动作都联系,即一个动作可以处理多个参数:
N (an integer). N个参数被组合成一个列表
$ parser = argparse.ArgumentParser()
$ parser.add_argument('--foo', nargs=2)
$ parser.add_argument('bar', nargs=1)
$ parser.parse_args('c --foo a b'.split())
Namespace(bar=['c'], foo=['a', 'b'])
注意,当nargs=1进,它生成一个只包涵一个元素的列表。不使用nargs的情况下,参数只是一个简单的参数自身。
‘?’. One argument will be consumed from the command line if possible, and produced as a single item. If no command-line argument is present, the value from default will be produced. Note that for optional arguments, there is an additional case - the option string is present but not followed by a command-line argument. In this case the value from const will be produced. Some examples to illustrate this:
$ parser = argparse.ArgumentParser()
$ parser.add_argument('--foo', nargs='?', const='c', default='d')
$ parser.add_argument('bar', nargs='?', default='d')
$ parser.parse_args(['XX', '--foo', 'YY'])
Namespace(bar='XX', foo='YY')
$ parser.parse_args(['XX', '--foo'])
Namespace(bar='XX', foo='c')
$ parser.parse_args([])
Namespace(bar='d', foo='d')
下面的更复杂的用法:
$ parser = argparse.ArgumentParser()
$ parser.add_argument('infile', nargs='?', type=argparse.FileType('r'),
... default=sys.stdin)
$ parser.add_argument('outfile', nargs='?', type=argparse.FileType('w'),
... default=sys.stdout)
$ parser.parse_args(['input.txt', 'output.txt'])
Namespace(infile=<_io.TextIOWrapper name='input.txt' encoding='UTF-8'>,
outfile=<_io.TextIOWrapper name='output.txt' encoding='UTF-8'>)
$ parser.parse_args([])
Namespace(infile=<_io.TextIOWrapper name='' encoding='UTF-8'>,
outfile=<_io.TextIOWrapper name='' encoding='UTF-8'>)
‘‘. All command-line arguments present are gathered into a list. Note that it generally doesn’t make much sense to have more than one positional argument with nargs=’‘, but multiple optional arguments with nargs=’*’ is possible. For example:
$ 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'])
‘+’. Just like ‘*’, all command-line args present are gathered into a list. Additionally, an error message will be generated if there wasn’t at least one command-line argument present. For example:
$ parser = argparse.ArgumentParser(prog='PROG')
$ parser.add_argument('foo', nargs='+')
$ parser.parse_args(['a', 'b'])
Namespace(foo=['a', 'b'])
$ parser.parse_args([])
usage: PROG [-h] foo [foo ...]
PROG: error: too few arguments
argparse.REMAINDER. All the remaining command-line arguments are gathered into a list. This is commonly useful for command line utilities that dispatch to other command line utilities:
$ parser = argparse.ArgumentParser(prog='PROG')
$ parser.add_argument('--foo')
$ parser.add_argument('command')
$ parser.add_argument('args', nargs=argparse.REMAINDER)
$ print(parser.parse_args('--foo B cmd --arg1 XX ZZ'.split()))
Namespace(args=['--arg1', 'XX', 'ZZ'], command='cmd', foo='B')
If the nargs keyword argument is not provided, the number of arguments consumed is determined by the action. Generally this means a single command-line argument will be consumed and a single item (not a list) will be produced.
命令行参数的常量值,通常与append_const和store_const相关。
必选参数和可选的参数的默认值。
$ parser = argparse.ArgumentParser()
$ parser.add_argument('--foo', default=42)
$ parser.parse_args(['--foo', '2'])
Namespace(foo='2')
$ parser.parse_args([])
Namespace(foo=42)
参数默认值的解析与参数的类型有关:
$ parser = argparse.ArgumentParser()
$ parser.add_argument('--length', default='10', type=int)
$ parser.add_argument('--width', default=10.5, type=int)
$ parser.parse_args()
Namespace(length=10, width=10.5)
For positional arguments with nargs equal to ? or *, the default value is used when no command-line argument was present:
$ parser = argparse.ArgumentParser()
$ parser.add_argument('foo', nargs='?', default=42)
$ parser.parse_args(['a'])
Namespace(foo='a')
$ parser.parse_args([])
Namespace(foo=42)
Providing default=argparse.SUPPRESS causes no attribute to be added if the command-line argument was not present.:
$ parser = argparse.ArgumentParser()
$ parser.add_argument('--foo', default=argparse.SUPPRESS)
$ parser.parse_args([])
Namespace()
$ parser.parse_args(['--foo', '1'])
Namespace(foo='1')
命令行参数的数据类型
$ parser = argparse.ArgumentParser()
$ parser.add_argument('foo', type=int)
$ parser.add_argument('bar', type=open)
$ parser.parse_args('2 temp.txt'.split())
Namespace(bar=<_io.TextIOWrapper name='temp.txt' encoding='UTF-8'>, foo=2)
type可以是任意Python支持的数据类型。
$ parser = argparse.ArgumentParser()
$ parser.add_argument('bar', type=argparse.FileType('w'))
$ parser.parse_args(['out.txt'])
Namespace(bar=<_io.TextIOWrapper name='out.txt' encoding='UTF-8'>)
$ def perfect_square(string):
... value = int(string)
... sqrt = math.sqrt(value)
... if sqrt != int(sqrt):
... msg = "%r is not a perfect square" % string
... raise argparse.ArgumentTypeError(msg)
... return value
...
$ parser = argparse.ArgumentParser(prog='PROG')
$ parser.add_argument('foo', type=perfect_square)
$ parser.parse_args(['9'])
Namespace(foo=9)
$ parser.parse_args(['7'])
usage: PROG [-h] foo
PROG: error: argument foo: '7' is not a perfect square
注意,choices列表中元素的类型应该与type批定的类型相兼容。
$ parser = argparse.ArgumentParser(prog='PROG')
$ parser.add_argument('foo', type=int, choices=range(5, 10))
$ parser.parse_args(['7'])
Namespace(foo=7)
$ parser.parse_args(['11'])
usage: PROG [-h] {5,6,7,8,9}
PROG: error: argument foo: invalid choice: 11 (choose from 5, 6, 7, 8, 9)
See the choices section for more details.
说明命令行参数的取值范围,它的值一般是一个列表。
$ parser = argparse.ArgumentParser(prog='game.py')
$ parser.add_argument('move', choices=['rock', 'paper', 'scissors'])
$ parser.parse_args(['rock'])
Namespace(move='rock')
$ parser.parse_args(['fire'])
usage: game.py [-h] {rock,paper,scissors}
game.py: error: argument move: invalid choice: 'fire' (choose from 'rock',
'paper', 'scissors')
注意,choices列表中元素的类型应该与type批定的类型相兼容。
$ parser = argparse.ArgumentParser(prog='doors.py')
$ parser.add_argument('door', type=int, choices=range(1, 4))
$ print(parser.parse_args(['3']))
Namespace(door=3)
$ parser.parse_args(['4'])
usage: doors.py [-h] {1,2,3}
doors.py: error: argument door: invalid choice: 4 (choose from 1, 2, 3)
说明参数是否必须进行输入,只支持可选参数。
$ parser = argparse.ArgumentParser()
$ parser.add_argument('--foo', required=True)
$ parser.parse_args(['--foo', 'BAR'])
Namespace(foo='BAR')
$ parser.parse_args([])
usage: argparse.py [-h] [--foo FOO]
argparse.py: error: option --foo is required
命令行参数的帮助信息,可以通过 -h/--help
来显示。
$ parser = argparse.ArgumentParser(prog='frobble')
$ parser.add_argument('--foo', action='store_true',
... help='foo the bars before frobbling')
$ parser.add_argument('bar', nargs='+',
... help='one of the bars to be frobbled')
$ parser.parse_args(['-h'])
usage: frobble [-h] [--foo] bar [bar ...]
positional arguments:
bar one of the bars to be frobbled
optional arguments:
-h, --help show this help message and exit
--foo foo the bars before frobbling
help
信息中使用格式化字符来避免重复的输入,例如:
$ parser = argparse.ArgumentParser(prog='frobble')
$ parser.add_argument('bar', nargs='?', type=int, default=42,
... help='the bar to %(prog)s (default: %(default)s)')
$ parser.print_help()
usage: frobble [-h] [bar]
positional arguments:
bar the bar to frobble (default: 42)
optional arguments:
-h, --help show this help message and exit
因为help
支持格式化字符,因此想要输出一个%
,可以通过%%
来进行转义。
$ parser = argparse.ArgumentParser(prog='frobble')
$ parser.add_argument('--foo', help=argparse.SUPPRESS)
$ parser.print_help()
usage: frobble [-h]
optional arguments:
-h, --help show this help message and exit
当ArgumentParser生成帮助信息时,它需要指定所需要参数的值。默认情况下,ArgumentParser使用dest的值作为每个参数的值。对于必选参数来说,直接使用dest的值 作为每个参数的值,对于可选参数来说,使用dest的值的大写形式作为每个参数的值。如下所示:
$ parser = argparse.ArgumentParser()
$ parser.add_argument('--foo')
$ parser.add_argument('bar')
$ parser.parse_args('X --foo Y'.split())
Namespace(bar='X', foo='Y')
$ parser.print_help()
usage: [-h] [--foo FOO] bar
positional arguments:
bar
optional arguments:
-h, --help show this help message and exit
--foo FOO
可以通过metavar来修改参数在帮助信息中显示值。
$ parser = argparse.ArgumentParser()
$ parser.add_argument('--foo', metavar='YYY')
$ parser.add_argument('bar', metavar='XXX')
$ parser.parse_args('X --foo Y'.split())
Namespace(bar='X', foo='Y')
$ parser.print_help()
usage: [-h] [--foo YYY] XXX
positional arguments:
XXX
optional arguments:
-h, --help show this help message and exit
--foo YYY
注意,metavar只改变参数在帮助信息中的显示值,parse_args()返回的Namespace对象中的属性的名依然由dest决定。
$ parser = argparse.ArgumentParser(prog='PROG')
$ parser.add_argument('-x', nargs=2)
$ parser.add_argument('--foo', nargs=2, metavar=('bar', 'baz'))
$ parser.print_help()
usage: PROG [-h] [-x X X] [--foo bar baz]
optional arguments:
-h, --help show this help message and exit
-x X X
--foo bar baz
绝大部分的ArgumentParser动作为parse_args()方法返回的Namespace对象的属性进行赋值,而属性的名称是由参数dest决定的。对于必选参数来说,dest默认等于必选参数的字面值。
$ parser = argparse.ArgumentParser()
$ parser.add_argument('bar')
$ parser.parse_args(['XXX'])
Namespace(bar='XXX')
对于可选参数来说,dest的值根据-s/--string
来推定:优先选择长字符串,具体的方法是:把字符串两侧的-
删掉,字符串中间的-
转换为_
。
$ parser = argparse.ArgumentParser()
$ parser.add_argument('-f', '--foo-bar', '--foo')
$ parser.add_argument('-x', '-y')
$ parser.parse_args('-f 1 -x 2'.split())
Namespace(foo_bar='1', x='2')
$ parser.parse_args('--foo 1 -y 2'.split())
Namespace(foo_bar='1', x='2')
当然可以通过dest参数来设定属性的名称:
$ parser = argparse.ArgumentParser()
$ parser.add_argument('--foo', dest='bar')
$ parser.parse_args('--foo XXX'.split())
Namespace(bar='XXX')
ArgumentParser.parse_args(args=None, namespace=None)
parse_args()方法将命令行参数字符串转换为相应对象并赋值给Namespace
对象的相应属性,默认返回一个Namespace
对象。
args - List of strings to parse. The default is taken from sys.argv.
字符串列表,默认来自sys.argv
namespace - An object to take the attributes. The default is a new empty Namespace object.
对象名,默认是一个空Namespace
对象。
class argparse.Namespace
调用parse_args()的返回值是一个Namespace
对象,它具有很多属性,每个属性都代表相应的命令行参数。
Namespace
对象是一个非常简单的类,可以通过vars()将之转换成字典类型。例如:
$ parser = argparse.ArgumentParser()
$ parser.add_argument('--foo')
$ args = parser.parse_args(['--foo', 'BAR'])
# args
Namespace(foo='BAR')
$ vars(args)
{'foo': 'BAR'}
另外还可以将ArgumentParser对象赋值给别的命令空间,而不是新建一个Namespace
对象,例如:
$ class C:
... pass
...
$ c = C()
$ parser = argparse.ArgumentParser()
$ parser.add_argument('--foo')
$ parser.parse_args(args=['--foo', 'BAR'], namespace=c)
$ c.foo
'BAR'