argparse模块是Python内置的用于命令项选项与参数解析的模块。不仅可在python文件中将算法参数集中放到一起,并且可在命令行/终端进行指定参数修改,非常适合深度学习中超参数的设置与修改。
import argparse
Hyplus目录
1 快速入门
基本操作
- 导入argparse包
- 创建
argparse.ArgumentParser
对象parser,即参数解析器/解析对象 - 用
add_argument
方法往parser中添加参数 - 用
parse_args
方法解析参数,所得的参数对象可正常用.
运算符调用各参数
示例
# quick_start.py
import argparse
parser = argparse.ArgumentParser()
parser.add_argument('--batch_size', type=int, default=64, help='num of batches')
parser.add_argument('--num_window', type=int, default=5, help='num of windows')
parser.add_argument('--weight', type=str, default=r'../pretrain.pth', help='path of the pretrained model')
args = parser.parse_args()
print(args.batch_size)
终端操作
python quick_start.py --batch_size 128
2 初始化参数解析器 ArgumentParser
参数解析器对象ArgumentParser保存了所有必要的信息,用以将命令行参数解析为相应的python数据类型。
# main.py
import argparse
# 创建参数解析器:一个用于把命令行字符串解析成Python对象的对象
parser = argparse.ArgumentParser(description="argparser示例")
部分属性如下,使用甚少,详见官方文档
- prog:程序的名称,默认同
sys.argv[0]
- usage:描述程序用途的字符串,默认从添加到解析器的参数生成
- description:在参数帮助文档之后显示的文本,默认无
3 添加参数 add_argument()
使用方法 add_argument() 添加参数,该方法的参数说明如下
parser.add_argument(name or flags...[, action][, nargs][, const][, default][, type][,choices][, required][, help][, metavar][, dest])
- name or flag:必选参数名或者可选参数标识符,必须作为add_argument()方法的第一个参数。
- 位置参数(Positional Arguments,必选参数):不带
-
或者--
前缀,该种方式要求必须输入该参数,输入该参数不需要指定参数名称,指定反而报错,解释器会自动将输入的参数赋值给对应参数; - 可选参数(Optional Arguments):通过一个
-
来指定的短参数(如-e
),简化参数输入;通过--
来指定的长参数(如--epoch
)。在命令行输入时输入短参数和长参数效果一样,注意若想通过解析后的参数取出该值,必须使用带--
的名称。
- 位置参数(Positional Arguments,必选参数):不带
- action:当读取的参数中出现指定参数的时候的行为(多为bool类型),取值如下所示
store
:存储值到指定变量(默认)store_const
:存储值在参数的const部分指定,多用于实现非布尔的命令行flagstore_true
/store_false
:布尔开关。用法:当命令行中出现具有action属性的参数时,该参数的值即为store_true
所表示的ture;当命令行中没有出现具有action属性的参数时,该参数的值为store_true
所表示的相对值false。append
:存储值到列表,该参数可以重复使用append_const
:存储值到列表,存储值在参数的const部分指定version
:打印关于程序的版本信息,然后退出
示例:action参数说明
parser = argparse.ArgumentParser(description="argparser使用示例") # 添加一个布尔参数train,当指令中出现这个参数时为false,否则为True parser.add_argument('--train', action='store_false', default=True) args = parser.parse_args() print(args.train)
命令行输入与结果如下
python main.py ## Output:True python main.py --train ## Output:False
由该例可知,当default和action_false同时满足时,action的优先级大于default。即出现
--train
命令时赋值为False而不是默认的True。
- nargs:设指定这个参数后面的值的数量,默认为1,多个参数值将被解析为一个列表,可接受如下取值
- int:具体数字,即应该读取的固定数量命令行参数个数。
?
:表示不指定值,对于位置参数使用default,对于可选参数使用const*
:表示0或多个参数+
:表示1或多个参数argparse.REMAINDER
:表示选项参数应该消耗剩余的命令行参数
- const: action和nargs所需的常量值
- default:未设置值情况下的默认参数
- type:输入参数的类型,可以为int、float、str,默认为str
- choices:说明命令行参数的取值范围,一般为一个列表。choices列表中元素的类型应该与type批定的类型相兼容。
- required:说明参数是否必须进行输入,只支持可选参数,默认False
- help:参数的说明信息
- metavar:在usage说明中的参数名称,对于必选参数默认为参数名称,对于可选参数默认为全大写的参数名称。
- dest:参数在程序中对应的变量名称,默认为
-
或--
后的字符串。 - count:统计参数简写输入的个数
# main.py(续)
# 添加一个可选参数,使用时,输入-lr和--learning_rate效果一样,但是解析时必须用learning_rate取出
parser.add_argument('-lr', '--learning_rate', default=1e-5, type=float, help='学习率')
# 添加一个可选参数,输入必须是bert/roberta/albert中的一个,否则报错
parser.add_argument('--model', default='bert', choices=['bert', 'roberta', 'albert'], help='模型')
# 添加一个可选参数,没有其他约束
parser.add_argument('--n_heads', type=int, help='注意力头数')
# 添加两个位置参数,必须输入,会按顺序赋值。输入该参数不需要指定参数名称,指定反而报错
parser.add_argument('epoch')
parser.add_argument('n_layers')
4 解析参数
4.1 parse_args()
使用方法 parse_args() 解析添加的参数。通过将检查命令行,把每个参数转换为适当的类型然后调用相应的操作。在大多数情况下,这意味着一个简单的Namespace对象将从命令行解析出的属性构建。
# main.py(续)
args = parser.parse_args()
print(args)
print(args.learning_rate)
print(args.model)
print(args.epoch)
print(args.n_layers)
在命令行输入以下指令,将2e-5赋值给learning_rate,将albert赋值给model,将30自动赋值给epoch,将6自动赋值给n_layers。随后输出结果
python main.py -lr 2e-5 --model albert 30 6
Namespace(learning_rate=2e-05, model='albert', n_heads=None, epoch='30', n_layers='6')
2e-05
albert
30
6
可以通过-h
命令查看程序和参数说明,且不会执行程序
python main.py -h # 或 python main.py --help
usage: main.py [-h] [-lr LEARNING_RATE] [--model {bert,roberta,albert}] [--n_heads N_HEADS] epoch n_layers
这是一个argparser使用示例程序
positional arguments:
epoch
n_layers
optional arguments:
-h, --help show this help message and exit
-lr LEARNING_RATE, --learning_rate LEARNING_RATE
学习率
--model {bert,roberta,albert}
模型
--n_heads N_HEADS 注意力头数
4.2 parse_known_args()
方法 parse_known_args() 也可用于解析参数,返回两个参数
args, unparsed = parser.parse_known_args()
args为namespace空间,包含程序定义了的命令行参数;unparsed为程序未定义的命令行输入参数。
和parse_args()不同的是,当命令行输入没有定义的参数时不会报错(parser_args()会报错),并返回一个列表unparsed,所包含的即是程序未定义的输入参数。
# parse_known_args.py
import argparse
parser = argparse.ArgumentParser(description="argparser示例")
parser.add_argument('--model', default='bert')
parser.add_argument('batch_size')
args, unparsed = parser.parse_known_args()
print(args)
print(unparsed)
命令行输入与结果如下
python parse_known_args.py --model roberta 32 --epoch 100 --lr 1e-5
Namespace(model='roberta', batch_size='32')
['--epoch', '100', '--lr', '1e-5']