【小知识】argparse — 命令行选项、参数和子命令解析器详解

  • Post author:
  • Post category:其他




一、argparse简介

argparse模块提供了非常方便的命令行参数解析功能,能够大大简化命令行程序的开发。

现在的大型项目中都会运用argparse来管理项目中涉及的参数,在使用命令行时更好地定义模型参数。



搜索得到的参数解释都不是很清楚所以做个总结。



argparse定义四个步骤:

1.导入argparse包 ——import argparse

2.创建一个命令行解析器对象 ——创建 ArgumentParser() 对象

3.给解析器添加命令行参数 ——调用add_argument() 方法添加参数

4.解析命令行的参数 ——使用 parse_args() 解析添加的参数



二、说明



1.参考示例

现有一个

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

在这里插入图片描述



2.add_argument参数



2.1 name_or_flags

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)

在这里插入图片描述



2.2 action、default


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")

在这里插入图片描述



2.3 nargs


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)

在这里插入图片描述

nargs参数的取值可以为以下几种:

N(例如3):参数接受 N 个值。

?:参数可以接受 0 个或 1 个值。

*:参数可以接受任意个数的值,存储为列表。

+:参数可以接受至少一个值,存储为列表。

示例:

import argparse

parser = argparse.ArgumentParser(description='Process some integers.') 
parser.add_argument("--ls", nargs="*")
args = parser.parse_args()
print(args.ls)

在这里插入图片描述



2.4 type


type

参数用于指定命令行参数的类型。在解析命令行参数时,

argparse

会将字符串类型的参数转换为指定的类型。下面是一些常见的type参数值:


str:字符串类型,这是默认值。

int:整数类型。

float:浮点数类型。

bool:布尔类型,接受True或False。

list:列表类型。


示例:指定转换为

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)

在这里插入图片描述



2.5 choices


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)

在这里插入图片描述



2.6 metavar


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)

在这里插入图片描述



2.7 dest


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)

在这里插入图片描述



三、总结


更详细的文档说明请参考:



Python中文文档



版权声明:本文为m0_46412065原创文章,遵循 CC 4.0 BY-SA 版权协议,转载请附上原文出处链接和本声明。