argparse
模块提供了非常方便的命令行参数解析功能,能够大大简化命令行程序的开发。
现在的大型项目中都会运用argparse
来管理项目中涉及的参数,在使用命令行时更好地定义模型参数。
现有一个scratch.py
的文件,使用命令行执行它。
import argparse
# 创建 ArgumentParser()对象
parser = argparse.ArgumentParser(description='Process some integers.') # description简单说明命令行参数的作用
# 调用add_argument() 方法添加参数
parser.add_argument("dataset", help="discribe dataset")
parser.add_argument("--big", action="store_const", default=0, const=999, help="discribe big")
# 使用 parse_args() 解析添加的参数
args = parser.parse_args()
# 调用dataset参数
print(args.dataset)
# 输出coco
name_or_flag
参数是一个命名(参数名),例如 dataset
或 -dataset
, --dataset
。如果同时传入-d和--dataset
,传参时任选一种即可。两者是等价的,只是在语法上稍有不同。当我们需要快速输入多个参数时,使用-d比--dataset
更快速。相当于-d时--dataset
的简写。
import argparse
parser = argparse.ArgumentParser(description='Process some integers.') #
parser.add_argument("-d", "--dataset", help="discribe dataset")
args = parser.parse_args()
print(args.dataset)
如果定义的是dataset
,则表示位置参数,用户在命令行中输入参数时,需要按照定义时的顺序输入且不用输入参数名。如下所示,按照name、age
顺序传入参数值。
import argparse
parser = argparse.ArgumentParser(description='Process some integers.') #
parser.add_argument("name", help="discribe name")
parser.add_argument("age", help="discribe age")
args = parser.parse_args()
# 打印参数值
print(args.name,args.age)
default
参数表示如果在命令行中没有输入参数值的话就会调用default
的默认值。如下所示,第一行命令没有传入is_action
,所以其默认值是False
action
参数表示如果在命令行中该参数名被找到时触发的操作或行为。比如is_action
参数定义了action="store_true"
,那么只要在命令行中出现了该参数,那么is_action
的值就会被设置为True
--is_action
所以结果输出为True
action="store_False"
表示解析到了/出现了该参数就设置为Fasle
import argparse
parser = argparse.ArgumentParser(description='Process some integers.')
parser.add_argument("--is_action",default=False, action="store_true", help="discribe is_action")
args = parser.parse_args()
print(args.is_action)
如果action="store_const"
表示解析到了/出现了该参数就设置为const
,其中const
为我们定义在action
后的const
参数值。如下所示:指定const=9999
parser.add_argument("--is_action",default=False, action="store_const",const=9999, help="discribe is_action")
nargs
参数用于指定命令行参数的个数,它决定了参数的输入方式和解析方式。如下图所示,指定nargs=3
,即--ls
需要传入3个值否者会报错。传入的3个值组成一个列表赋值给--ls
import argparse
parser = argparse.ArgumentParser(description='Process some integers.')
parser.add_argument("--ls", nargs=3)
args = parser.parse_args()
print(args.ls)
示例:
import argparse
parser = argparse.ArgumentParser(description='Process some integers.')
parser.add_argument("--ls", nargs="*")
args = parser.parse_args()
print(args.ls)
type
参数用于指定命令行参数的类型。在解析命令行参数时,argparse
会将字符串类型的参数转换为指定的类型。下面是一些常见的type参数值:
示例:指定转换为int
类型,传入--dataset 为coco
时报错,因为coco不能转换为int类型
。传入--dataset
为字符串类型的"909"时,成功转换为int类型。
import argparse
parser = argparse.ArgumentParser(description='Process some integers.')
parser.add_argument("--dataset", type=int)
args = parser.parse_args()
print(args.dataset)
import argparse
parser = argparse.ArgumentParser(description='Process some integers.')
parser.add_argument("--dataset", type=list)
args = parser.parse_args()
print(args.dataset)
choice
参数用于指定命令行参数的可选值。如下所示,指定--dataset只能取coco或者voc2012
,否则报错。
import argparse
parser = argparse.ArgumentParser(description='Process some integers.')
parser.add_argument("--dataset", choices=["coco","voc2012"])
args = parser.parse_args()
print(args.dataset)
metavar
当使用 python xx.py --help
命令获取参数信息时,仅仅改变参数的显示名字,不改变参数的调用方式。
import argparse
parser = argparse.ArgumentParser(description='Process some integers.')
parser.add_argument("--dataset")
args = parser.parse_args()
print(args.dataset)
即在打印帮助信息时,可以帮助用户理解--dataset
参数的作用,即它是用于指定train_dataset
import argparse
parser = argparse.ArgumentParser(description='Process some integers.')
parser.add_argument("--dataset", metavar="train_dataset")
args = parser.parse_args()
print(args.dataset)
dest
参数用于指定解析器解析命令行参数后,将其存储在哪个属性中。默认情况下,argparse
将使用参数的名称作为属性的名称。例如,如果参数名称为--dataset
,则解析器将创建一个名为dataset
的属性,即上文中的print(args.dataset)
,并将解析结果存储在该属性中。如果指定了dest
参数,则可以使用不同的名称存储解析结果。
注意 此时不是
print(args.dataset)而是print(args.train_set)
,相当于重命名属性名称使其更容易理解。
import argparse
parser = argparse.ArgumentParser(description='Process some integers.')
parser.add_argument("--dataset", dest="train_set")
args = parser.parse_args()
# 注意 此时不是args.dataset而是args.train_set
print(args.train_set)