介绍
最近在看深度学习的一些代码,发现大佬们经常使用argparse包,于是看了看这个包的简单用法。
argparse是Python的内置包,不需要手动安装。它是Python 标准库中推荐的命令行解析模块。
传入一个位置参数
import argparse
parser = argparse.ArgumentParser()
parser.add_argument('-epochs', type=int, help='训练轮次')
# 解析参数列表
args = parser.parse_args()
# 使用.参数名可以获取到参数值
print(args.epochs)
add_argument函数用于指定程序能够接受哪些命令行选项。
1. 第一个参数为添加的位置参数名称
2. 第二个参数 type 为该位置参数的类型
3. 第三个参数 help 为提示信息
打开命令行窗口,切换到当前目录,输入命令 python test.py -epochs 100
可以看到输出结果为100.
- 如果不传值默认为None
输入命令 python test.py -h
或 python test.py --help
可以看到帮助信息:
usage: test.py [-h] [-epochs EPOCHS]
optional arguments:
-h, --help show this help message and exit
-epochs EPOCHS 训练轮次
为单个参数传入多个值
import argparse
parser = argparse.ArgumentParser()
parser.add_argument('-epochs', type=int, nargs='+', help='训练轮次')
args = parser.parse_args()
print(args.epochs)
在 add_argument
方法中设置 nargs
参数可以输入多个值,其中:
'+' 表示参数可设置一个或多个
'*' 表示参数可设置零个或多个
'?' 表示参数可设置零个或一个
N 表示参数为N个
在命令行中输入 python test.py -epochs 100 80 50 10
, 将看到返回结果:[100, 80, 50, 10]
添加多个参数
import argparse
parser = argparse.ArgumentParser()
parser.add_argument('-epochs', type=int, help='训练轮次')
parser.add_argument('-learning_rate', type=float, help='学习率')
parser.add_argument('-image_size', type=int, help='输入图片大小')
args = parser.parse_args()
print('训练轮次:', args.epochs)
print('学习率:', args.learning_rate)
print('图片大小:', args.image_size)
在命令行中输入 python test.py -epochs 100 -learning_rate 0.001 -image_size 224
,可以看到输出的结果:
训练轮次: 100
学习率: 0.001
图片大小: 224
可选参数
有时候我们会遇到可选的参数,在参数名前加 '--'
即可。
import argparse
parser = argparse.ArgumentParser()
parser.add_argument('-epochs', type=int, help='训练轮次')
parser.add_argument('--checkpoint', type=bool, help='是否保存检查点')
args = parser.parse_args()
print('训练轮次:', args.epochs)
print('是否保存检查点:', args.checkpoint)
在命令行中输入 python test.py -epochs 100
,可以看到输出结果:
训练轮次: 100
是否保存检查点: None
输入 python test.py -epochs 100 --checkpoint True
,则输出结果变为:
训练轮次: 100
是否保存检查点: True
短选项
如果你熟悉命令行的用法,会知道可以为参数设置一个便捷输入。
import argparse
parser = argparse.ArgumentParser()
parser.add_argument('-epochs', type=int, help='训练轮次')
parser.add_argument('-lr', '--learning_rate', type=float, help='学习率')
args = parser.parse_args()
print('训练轮次:', args.epochs)
print('学习率:', args.learning_rate)
在命令行输入 python test.py -epochs 100 --learning_rate 0.001
,可以看到输出结果:
训练轮次: 100
学习率: 0.001
输入 python test.py -epochs 100 -lr 0.001
, 也可以得到相同的输出结果。这样可以方便一些参数的输入。
从代码中可以看到短选项只能与可选参数搭配使用。
默认值
可以在 add_argument
方法中设置 default
参数,来为参数指定默认值。
import argparse
parser = argparse.ArgumentParser()
parser.add_argument('-epochs', type=int, default=100,help='训练轮次')
parser.add_argument('-lr', '--learning_rate', type=float, default=0.001,help='学习率')
args = parser.parse_args()
print('训练轮次:', args.epochs)
print('学习率:', args.learning_rate)
在控制台输入命令 python test.py
, 可以得到运行结果:
训练轮次: 100
学习率: 0.001
必须参数
可以在 add_argument
方法中设置 required
参数,指定该参数必须输入。
import argparse
parser = argparse.ArgumentParser()
parser.add_argument('-epochs', type=int, required=True, help='训练轮次')
args = parser.parse_args()
print('训练轮次:', args.epochs)
在命令行输入 python test.py
,将会报错:
usage: test.py [-h] -epochs EPOCHS
test.py: error: the following arguments are required: -epochs
如果不指定 required=True
, 若不传入值,则默认为None,而现在不传入值,将会报错。
输入 python test.py -epochs 50
, 将会看到期望的结果50
限定参数的值
可以在 add_argument
方法中设置 choices
参数,指定该参数的可能值。
import argparse
parser = argparse.ArgumentParser()
parser.add_argument('-epochs', type=int, choices=[10,50,100],help='训练轮次')
args = parser.parse_args()
print('训练轮次:', args.epochs)
我们使用 choices
将 epochs
的取值限定为 10,50,100,如果输入的数不在这三个数之中,则会报错。
更改 parse_args 中的参数名称
可以在 add_argument
方法中设置 dest
参数,指定该参数在parse_args中的名称。
import argparse
parser = argparse.ArgumentParser()
parser.add_argument('-epochs', type=int, dest='e',help='训练轮次')
args = parser.parse_args()
print('训练轮次:', args.e)
上面的代码中,我们使用 dest
将 epochs
参数在parse_args
中的名称改为了 e
。
注意在命令行中输入的命令仍为 python test.py -epochs 5
传入bool类型
如果将 type 参数设置为 bool,那么参数输入什么,永远都是 True,这个设定有些反常识,我们可以使用 action='store_true'
达到传入bool类型的目的。
import argparse
parser = argparse.ArgumentParser()
# 如果这样设置,无论输入什么,永远都是True,除非不指定该参数,那么默认值为None
# parser.add_argument('--save', type=bool ,help='是否保存训练权重')
# store_true表示如果指定该参数,则为 True, 然后设置默认值为False
parser.add_argument('--save', action='store_true',default=False ,help='是否保存训练权重')
args = parser.parse_args()
print('是否保存:', args.save)
此时在控制台输入 python test.py --save
,会打印出 True
,如果直接输入python test.py
,则结果为 False
。
同样的 store_false
表示指定该参数时值为False
,此时的默认值应该设置为 True