argparse 模块是 Python 内置的一个用于命令项选项与参数解析的模块,argparse 模块可以让人轻松编写用户友好的命令行接口。通过在程序中定义好我们需要的参数,然后 argparse 将会从 sys.argv 解析出这些参数。argparse 模块还会自动生成帮助和使用手册,并在用户给程序传入无效参数时报出错误信息。
我们常常可以把argparse的使用简化成下面四个步骤
首先导入该模块;然后创建一个解析对象;然后向该对象中添加你要关注的命令行参数和选项,每一个add_argument方法对应一个你要关注的参数或选项;最后调用parse_args()方法进行解析;解析成功之后即可使用。
1、导入该模
from argparse import ArgumentParser
2、创建一个解析对象
parser = ArgumentParser(description=None)
ArgumentParser 对象包含将命令行解析成 Python 数据类型所需的全部信息。
描述description
大多数对 ArgumentParser 构造方法的调用都会使用 description= 关键字参数。这个参数简要描述这个程度做什么以及怎么做。在帮助消息中,这个描述会显示在命令行用法字符串和各种参数的帮助消息之间。
3、然后向该对象中添加你要关注的命令行参数和选项,每一个add_argument方法对应一个你要关注的参数或选项,详情参考官方文档:https://docs.python.org/zh-cn/3/library/argparse.html#action
ArgumentParser.add_argument(name or flags...[, action][, nargs][, const][, default][, type][, choices][, required][, help][, metavar][, dest])¶
# 定义单个的命令行参数应当如何解析。
###1 可选参数和必选参数
# name or flags - 一个命名或者一个选项字符串的列表,例如 foo 或 -f, --foo。可选参数(用'-'或者'- -'指定)和必选参数(不加'-'或者'- -'指定)
###2 action 只传参数,不需要传参数值
# action - 当参数在命令行中出现时使用的动作基本类型。注意,这里一般不用传值,传值会报错。
# action='store_true' 是指只传参数名时为真True,不传为假,即默认False.
# action='store_false' 是指只传参数名时为假False,不传为真,即默认True.
# action='store_const' 只传参数名,使用const值,不传为None,如果存在defalut,不传为defalut的值
nargs - 表示设置参数个数
nargs =N (一个整数)。命令行中的 N 个参数会被聚集到一个列表中
nargs=‘*’: 表示参数可设置零个或多个
nargs=‘+’:表示参数可设置一个或多个
nargs=‘?’: 表示参数可设置零个或一个。
const - 被一些 action 和 nargs 选择所需求的常数。
default - 当参数未在命令行中出现并且也不存在于命名空间对象时所产生的值。
type - 命令行参数应当被转换成的类型。
choices - 可用的参数的容器。
required - 此命令行选项是否可省略 (仅选项可用)。
help - 一个此选项作用的简单描述。
metavar - 在使用方法消息中使用的参数值示例。
dest - 被添加到 parse_args() 所返回对象上的属性名。
4、后调用parse_args()方法进行解析,解析成功之后即可使用。
args = parser.parse_args()
5、add_argument方法使用举例:
parser.add_argument('config', help='train config file path')#必选参数
parser.add_argument('--work-dir', help='the dir to save logs and models')#可选参数
parser.add_argument(
'--auto-resume',
action='store_true',
help='resume from the latest checkpoint automatically')
parser.add_argument(
'--launcher',
choices=['none', 'pytorch', 'slurm', 'mpi'],
default='none',
help='job launcher')
###action 只传参数,不需要传参数值
# action - 当参数在命令行中出现时使用的动作基本类型。注意,这里一般不用传值,传值会报错。
# action='store_true' 是指只传参数名时为真True,不传为假,即默认False.
# action='store_false' 是指只传参数名时为假False,不传为真,即默认True.
# action='store_const' 只传参数名,使用const值,不传为None,如果存在defalut,不传为defalut的值
parser.add_argument('--foo', action='store_true')
parser.add_argument('--bar', action='store_false')
parser.add_argument('--con', action='store_const',const=3)
print(parser.parse_args(['--foo','--bar']))
###3 nargs - 表示设置参数个数
# nargs =N (一个整数)。命令行中的 N 个参数会被聚集到一个列表中
# nargs=‘*’: 表示参数可设置零个或多个,放在列表中,0个的时候列表为空
# nargs=‘+’:表示参数可设置一个或多个,放在列表中
# nargs=‘?’: 表示参数可设置零个或一个。可以三种形式 1 啥都没有 2 只有参数 3 参数和参数值
###4 const - 被一些 action 和 nargs 选择所需求的常数。 必须搭配nargs或者action='store_const'
import argparse
parser = argparse.ArgumentParser(description='argparse learning')
parser.add_argument('--para1', nargs='?', const='c', default='d')
parser.add_argument('para2', nargs='?', default='d')
args1 = parser.parse_args(['XX', '--para1', 'YY']) # 存在且有值
args2 = parser.parse_args(['XX', '--para1']) # 存在但无值
args3 = parser.parse_args([]) # 不存在
print(args1, '\n', args2, '\n', args3)
### nargs +
# metavar - 在使用方法消息中使用的参数值示例。
# dest - 被添加到 parse_args() 所返回对象上的属性名。
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(['--sum'])
print(args.accumulate(args.integers))
6、注意事项
args分为可选参数(用’-‘或者’- -‘指定)和必选参数(不加’-‘或者’- -'指定)
当’-‘和’- -‘同时出现的时候,系统默认带’- -'的为参数名,但是在命令行输入的时候,用其中任何一个指定都可以。如:
parser.add_argument('-f', '--foo')#系统认定foo为参数名,但是在命令行输入时,-f 'aa'或者 --foo 'aa'
第一个位置参数假如说是–work_dir,如果写成–work-dir,但是他在调用的时候仍然用的是–work_dir,在这里他们表示同一个意思,-对应_。
必选参数,按照其赋值顺序给对应顺序的位置参数赋值