⬆︎
×
TOC
CHAT

argparse参数配置模块简介

argparse模块是Python内置的用于命令项选项与参数解析的模块。不仅可在python文件中将算法参数集中放到一起,并且可在命令行/终端进行指定参数修改,非常适合深度学习中超参数的设置与修改。

import argparse

1 快速入门

基本操作

  1. 导入argparse包
  2. 创建argparse.ArgumentParser对象parser,即参数解析器/解析对象
  3. add_argument方法往parser中添加参数
  4. 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])
  1. name or flag:必选参数名或者可选参数标识符,必须作为add_argument()方法的第一个参数。
    • 位置参数(Positional Arguments,必选参数):不带-或者--前缀,该种方式要求必须输入该参数,输入该参数不需要指定参数名称,指定反而报错,解释器会自动将输入的参数赋值给对应参数;
    • 可选参数(Optional Arguments):通过一个-来指定的短参数(如-e),简化参数输入;通过--来指定的长参数(如--epoch)。在命令行输入时输入短参数和长参数效果一样,注意若想通过解析后的参数取出该值,必须使用带--的名称。
  2. action:当读取的参数中出现指定参数的时候的行为(多为bool类型),取值如下所示
    • store:存储值到指定变量(默认)
    • store_const:存储值在参数的const部分指定,多用于实现非布尔的命令行flag
    • store_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。

  1. nargs:设指定这个参数后面的值的数量,默认为1,多个参数值将被解析为一个列表,可接受如下取值
    • int:具体数字,即应该读取的固定数量命令行参数个数。
    • ?:表示不指定值,对于位置参数使用default,对于可选参数使用const
    • *:表示0或多个参数
    • +:表示1或多个参数
    • argparse.REMAINDER:表示选项参数应该消耗剩余的命令行参数
  2. const: action和nargs所需的常量值
  3. default:未设置值情况下的默认参数
  4. type:输入参数的类型,可以为int、float、str,默认为str
  5. choices:说明命令行参数的取值范围,一般为一个列表。choices列表中元素的类型应该与type批定的类型相兼容。
  6. required:说明参数是否必须进行输入,只支持可选参数,默认False
  7. help:参数的说明信息
  8. metavar:在usage说明中的参数名称,对于必选参数默认为参数名称,对于可选参数默认为全大写的参数名称。
  9. dest:参数在程序中对应的变量名称,默认为---后的字符串。
  10. 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']

发表评论