argparse是Python标准里用来处理命令行参数的库。
ArgumentParser对象保存了所有必要的信息,用以将命令行参数解析为相应的python数据类型,其中description参数表示在命令行显示帮助信息。该对象还有其他参数,一般较少使用,此处不再赘述,详情可见官方文档。
import argparse
# 创建参数解析器:一个用于把命令行字符串解析成Python对象的对象
parser = argparse.ArgumentParser(description="这是一个argparser使用示例程序")
使用add_argument()方法添加参数,该方法的参数说明如下。
name or flags - 必选参数名或者可选参数标识符,它必须作为add_argument()方法的第一个参数。
命令行参数分为位置参数和选项参数:
位置(必选)参数:前面不需要-或者–,该种方式则要求必须输入该参数,输入该参数不需要指定参数名称,指定反而报错,解释器会自动将输入的参数赋值给对应参数;
可选参数:通过一个-来指定的短参数,如-e,作用是简化参数输入;通过–来指定的长参数,如–epoch。在命令行输入时输入短参数和长参数效果一样,需要注意的是,如果想通过解析后的参数取出该值,必须使用带–的名称。
dest - 参数在程序中对应的变量名称
action - 表示值赋予键的方式,这里用到的是bool类型,action意思是当读取的参数中出现指定参数的时候的行为。
help - 参数的说明信息
required - 说明参数是否必须进行输入,只支持可选参数,默认False。
type - 指定命令行参数数据类型
choices - 说明命令行参数的取值范围,它的值一般是一个列表。choices列表中元素的类型应该与type批定的类型相兼容。
nargs - 指定这个参数后面的value有多少个,默认为1。
default - 必选参数和可选的参数的默认值。
一般常用的参数主要为name or flags、action、help、type、default。
import argparse
# 创建参数解析器:一个用于把命令行字符串解析成Python对象的对象
parser = argparse.ArgumentParser(description="这是一个argparser使用示例程序")
# 添加一个可选参数,使用时,输入-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')
使用parse_args()解析添加的参数,它将检查命令行,把每个参数转换为适当的类型然后调用相应的操作。在大多数情况下,这意味着一个简单的Namespace对象将从命令行解析出的属性构建。
接示例1代码
args = parser.parse_args()
print(args)
print(args.learning_rate)
print(args.model)
print(args.epoch)
print(args.n_layers)
在命令行中输入:
python main.py -lr 2e-5 --model albert 30 6
该命令意为:将2e-5赋值给learning_rate,将albert赋值给model,将30自动赋值给epoch,将6自动赋值给n_layers。
输出结果如下:
Namespace(learning_rate=2e-05, model='albert', n_heads=None, epoch='30', n_layers='6')
2e-05
albert
30
6
在命令行中输入:
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 注意力头数
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
## 输出:True
python main.py --train
## 输出:False
通过上例可见,当default和action_false同时满足时,action的优先级是大于default的。即出现了’–train‘命令,赋值为False而不是默认的True。
该方法也可用于解析参数,该方法返回两个参数:
args, unparsed = parser.parse_known_args()
args为namespace空间,包含程序定义了的命令行参数,而unparsed为程序没有定义的命令行参数。和上面函数不一样的在于,如果命令行输入没有定义的参数,不会报错(但是parser_args()会报错),并且返回一个列表给unparsed,里面包含的就是未定义的输入参数。
你的参数设置可能不会在一个函数或包中调用完成。
在很多时候,我们可能会需要根据一些输入的参数,来决定其他参数的设置。比如在深度学习中,我们可能会根据传入的模型设置–model来决定我们调用的是哪个模型代码,然后在该模型中还会有一部分的参数设置。
那么这时候就会出现一种情况,就是运行命令中会传入所有需要设置的参数值,但是有时候仅获取到基本参数设置时可能要进行一些操作然后才继续导入剩下的参数设置。
parse_known_args()方法的作用就是当仅获取到基本设置时,如果运行命令中传入了之后才会使用到的其他配置,不会报错;而是将多出来的部分保存起来,留到后面使用。
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 main.py --model roberta 32 --epoch 100 --lr 1e-5
输出结果如下:
Namespace(model='roberta', batch_size='32')
['--epoch', '100', '--lr', '1e-5']
可见,未添加到解析器中的参数epoch和lr都被以列表的形式(list)保存起来。