Python – argparse :命令行参数解析模块
文章目录
1. 总述
argparse
模块提供了程序与命令行的接口,通过使用argparse
模块可以对传入程序的参数进行定义,规定、限制等操作。其总体操作可分为以下四个步骤:
- 导入
argparse
,import argparse
. - 创建一个命令行解析器对象:
parser = argparse.ArgumentParser()
- 在解析器对象中添加命令行参数和参数的相关属性:调用
add_argument()
函数,重点。 - 解析命令行的参数:使用
args = parser.parse_args()
即可获得传入的命令行参数。
前两步较为简单,如下代码中先创建个解析器对象,以便于下文介绍add_argument()
函数。
# 导入库
import argparse
# 1. 定义命令行解析器对象
parser = argparse.ArgumentParser(description='Demo of argparse')
2. add_argument()
ArgumentParser.add_argument(name or flags...[, action][, nargs][, const][, default][, type][, choices][, required][, help][, metavar][, dest])
如上,add_argument中包含必传参数name or flags
以及多个可选参数,下面介绍常用参数的含义和实例:
2.1 name or flags
该参数确定了添加的命令行参数是可选的参数还是必须传入的(位置参数positional arguments)。若是可选的,则add_argument()
的第一个参数必须是一个flag或则一系列flags 如'--foo','-f'
; 反之若是必须的,则add_argument()
的第一个参数需要是给该命令行参数定义的名字。见下代码:
# 添加可选参数
>>> parser.add_argument('-f', '--foo')
# 添加必要参数 ,命名为'bar'
>>> parser.add_argument('bar')
>>> parser.parse_args(['BAR']) # 进行解析传入'bar'参数
Namespace(bar='BAR', foo=None) # 此时没有传入foo参数所以为none
>>> parser.parse_args(['BAR', '--foo', 'FOO'])
Namespace(bar='BAR', foo='FOO')
>>> parser.parse_args(['--foo', 'FOO']) # 当不传入必要参数时会报错!!!
usage: [-h] [-f FOO] bar
: error: the following arguments are required: bar
由上也可知当调用parse_args
时(即传入命令行参数时),可选参数前需要加上其对应的flag,剩下的参数都会依次默认为对应顺序的必选参数。
2.2 action
action
参数明确了收到命令行参数后应该进行怎样的处理。其可选参数有[‘store’, ‘store_const’, ‘store_true’, ‘store_false’, ‘append’, ‘append_const’, ‘count’, ‘help’, ‘version’, ‘extend’]
下文介绍常用的几个选项,其他具体实例可参考文章开头的官网链接。
-
store
, 保存命令行参数的值。这是action
的默认选项。 -
store_true
和store_false
: 会自动生成对应的True和False默认值, 在命令行指定该参数名字时会自动将该参数保存为相应的bool值。但若没在命令行中指定,则会保存与action给定的相反的bool值。>>> 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()) # 指定了--foo 和 --bar 这这两个值保存相对应的bool值,baz没有指定则保存相反的bool值 Namespace(foo=True, bar=False, baz=True) >>> parser.add_argument('--fff', action='store_true') >>> parser.parse_args() Namespace(foo=False, bar=True, baz=True, fff=False)
-
…
-
可以通过扩展
Action
类进行自定义action,通过重写__call__
和__init__
等进行重构action要实现得功能。如mmcv中扩展的DictAction
2.3 nargs
nargs
指定每一个命令行参数需要接收参数的个数。其支持以下值:
-
N
: N个命令行参数将会一起组成个列表进行传入该参数。当N
指定为1时,也会将单个元素以列表形式返回。>>> parser = argparse.ArgumentParser() >>> parser.add_argument('--foo', nargs=2) >>> parser.add_argument('bar', nargs=1) >>> parser.parse_args('c --foo a b'.split()) Namespace(foo=['a', 'b'], bar=['c'])
-
'*'
和'+'
:对应位置的所有命令行参数都会被保存在一个list中,但当传入的参数个数为0时’+‘选项会报错,而’*'不会。>>> parser = argparse.ArgumentParser() >>> parser.add_argument('--foo', nargs='*') >>> parser.add_argument('--bar', nargs='*') >>> parser.add_argument('baz', nargs='*') >>> parser.add_argument('--fff', nargs='+') >>> parser.parse_args('a b --foo x y --bar 1 2 --fff 0 0 0'.split()) Namespace(foo=['x', 'y'], bar=['1', '2'], baz=['a', 'b'], fff=['0', '0', '0']) # 当指定--bar, 但不传入参数时,不会报错,会报错空列表 >>> parser.parse_args('a b --foo x y --bar'.split()) Namespace(foo=['x', 'y'], bar=[], baz=['a', 'b'], fff=None) # 当指定--fff, 但不传入参数时,会产生报错 >>> parser.parse_args('a b --foo x y --bar 1 2 --fff'.split()) usage: [-h] [--foo [FOO ...]] [--bar [BAR ...]] [--fff FFF [FFF ...]] [baz ...] : error: argument --fff: expected at least one argument
-
?
: 具体见官网,可用来指定传入文件。
2.4 default
当可选参数和位置参数没有在命令行指定时,default
会指定其在程序中使用的值。对于可选参数,当该参数没有在命令行指定时,则会使用default中的值。对于位置参数,则需要配合nargs='?'
一起使用,此时当命令行没有指定该位置参数时,会默认为default中定义的值。default的值默认为None.
>>> parser = argparse.ArgumentParser()
>>> parser.add_argument('--foo', default=42)
>>> parser.parse_args(['--foo', '2'])
Namespace(foo='2')
>>> parser.parse_args([])
Namespace(foo=42)
# 位置参数,配合nargs=‘?’使用
>>> parser = argparse.ArgumentParser()
>>> parser.add_argument('foo', nargs='?', default=42)
>>> parser.parse_args(['a'])
Namespace(foo='a')
>>> parser.parse_args([])
Namespace(foo=42)
2.5 type
默认接受的命令行参数都是字符串,当我们需要转换类型时,可以指定type.如指定为int和float类型。
3. parse_args() :解析命令行的参数
ArgumentParser对象通过 parse_args() 方法解析命令行的参数。它将检查命令行中每个参数,转换为适当的数据类型,然后调用相应的操作,并把参数结构化后存放在对象args中。
args = parser.parse_args()
在脚本中,通常 parse_args() 会被不带参数调用,而 ArgumentParser 将自动从 sys.argv 中确定命令行参数。
4. 脚本中使用命令行参数
使用args调用参数包含的数据,如args.foo
便可以调用foo命令行传入的参数的数据。
更新中…