声明
本文借阅了各网站大佬的经验,已将原文附 Reference 部分,再此表达最诚挚的谢意,如有侵权,本人立即删除!
argparse 模块
argparse 是一个 Python 模块:命令行选项、参数和子命令解析器。
argparse 模块可以让人轻松编写用户友好的命令行接口。程序定义它需要的参数,然后 argparse 将弄清如何从 sys.argv 解析出那些参数。 argparse 模块还会自动生成帮助和使用手册,并在用户给程序传入无效参数时报出错误信息。
使用流程
1. 创建解析器
parser = argparse.ArgumentParser(description='Process some integers.')
使用 argparse 的第一步是创建一个 ArgumentParser 对象。
ArgumentParser 对象包含将命令行解析成 Python 数据类型所需的全部信息。2. 添加参数
parser.add_argument('integers', metavar='N', type=int, nargs='+', help='an integer for the accumulator')
给一个 ArgumentParser 添加程序参数信息是通过调用 add_argument() 方法完成的。
3. 解析参数
>>> parser.parse_args(['--sum', '7', '-1', '42'])Namespace(accumulate=<built-in function sum>, integers=[7, -1, 42])
ArgumentParser 通过 parse_args() 方法解析参数。
ArgumentParser 对象
class argparse.ArgumentParser(prog=None, usage=None, description=None, epilog=None, parents=[], formatter_class=argparse.HelpFormatter, prefix_chars='-', fromfile_prefix_chars=None, argument_default=None, conflict_handler='error', add_help=True, allow_abbrev=True)
prog
– 程序的名称(默认:sys.argv[0])usage
– 描述程序用途的字符串(默认值:从添加到解析器的参数生成)description
– 在参数帮助文档之前显示的文本(默认值:无)epilog
– 在参数帮助文档之后显示的文本(默认值:无)parents
– 一个 ArgumentParser 对象的列表,它们的参数也应包含在内formatter_class
– 用于自定义帮助文档输出格式的类prefix_chars
– 可选参数的前缀字符集合(默认值:’-’)fromfile_prefix_chars
– 当需要从文件中读取其他参数时,用于标识文件名的前缀字符集合(默认值:None)argument_default
– 参数的全局默认值(默认值: None)argument_default
– 参数的全局默认值(默认值: None)add_help
– 为解析器添加一个 -h/–help 选项(默认值: True)allow_abbrev
– 如果缩写是无歧义的,则允许缩写长选项 (默认值:True)
add_argument() 方法
ArgumentParser.add_argument(name or flags...[, action][, nargs][, const][, default][, type][, choices][, required][, help][, metavar][, dest])
name or flags
– 一个命名或者一个选项字符串的列表,例如 foo 或 -f, –foo。action
– 当参数在命令行中出现时使用的动作基本类型。nargs
– 命令行参数应当消耗的数目。const
– 被一些 action 和 nargs 选择所需求的常数。default
– 当参数未在命令行中出现时使用的值。default
– 当参数未在命令行中出现时使用的值。choices
– 可用的参数的容器。required
– 此命令行选项是否可省略 (仅选项可用)。help
– 一个此选项作用的简单描述。metavar
– 在使用方法消息中使用的参数值示例。dest
– 被添加到 parse_args() 所返回对象上的属性名。
实例分析
1. 基本使用
~~~~~~ 当我们执行某个 Python 代码,例如文件 mycode.py 时,想要传递一些可以随时改变的自定义的参数。比如在训练神经网络的时候,我们为了方便修改训练的 batch 大小,epoch 的大小等等,往往不想去动代码。此时最方便的方法就是在执行代码的时候从命令行传入参数。argparse.ArgumentParser() 可以很好地满足这一需求。
import argparse parser = argparse.ArgumentParser()parser.add_argument("square", help="display a square of a given number", type=int)args = parser.parse_args()print(args.square**2)
~~~~~~ 改代码首先创建一个 ArgumentParser 对象,添加参数 square,最后采用方法 parser.add_argument。每添加一个参数,就需要调用一次该方法。args = parser.parse_args() 则是使得改代码生效。执行这段代码时,我们在命令行输入
python mycode.py 9
可以得到输出结果是 9 的平方,即 81。
当然,添加多个参数时,执行的时候顺序输入这些参数。例如 mycode.py 中是如下代码:
import argparse parser = argparse.ArgumentParser()parser.add_argument("square", help="display a square of a given number", type=int)parser.add_argument("number", help="display a given number", type=int)args = parser.parse_args()print(args.square**2)print(args.number)
我们在命令行输入:
python mycode.py 20 999
输出:
400999
2. parser.print_help()
argparse.ArgumentParser():创建对象
parser = argparse.ArgumentParser(description='PyTorch MNIST pruning from deep compression paper')parser.add_argument("square", help="display a square of a given number", type=int)parser.add_argument("number", help="display a given number", type=int)args = parser.parse_args()print(args.square**2)print(args.number)parser.print_help()
其中 parser.print_help() 的功能是我们创建的 parser 的相关信息。命令行输入:
400999usage: day1.py [-h] square numberPyTorch MNIST pruning from deep compression paperpositional arguments:squaredisplay a square of a given numbernumberdisplay a given numberoptional arguments:-h, --helpshow this help message and exit
可以看到,description 中的文字也得到了输出。
parser.add_argument():
添加参数
parser.add_argument():
可配置的参数比较多,第一个是name,也就是名称。前面的例子中,我们用了
parser.add_argument("square", help="display a square of a given number", type=int)
3. name 参数
~~~~~~ 其中 “square” 就是传递给 name 的参数(也可以单引号的 ’square’ )。这里还有个 help 参数,他和argparse.ArgumentParser() 中的 description 类似,没有实际作用,起到一个注释的作用,会在 parser.print_help() 后打印出来。而显然 type 参数指定了输入参数的类型,int 是整数,float 是浮点,str 是字符串。
回到 name 参数,他除了可以直接用上面的 square 字符串,也可以一个横杠加字符串以及两个横杠加字符串,例如 ’-sqaure
’ 和 ’–square
’ 。常见的是两个横杠的写法。下面来说说我个人发现的区别。没有横杠的写法,如我们前面所示,在命令行传入参数的时候,不需要重写名字,直接输入参数:
python mycode.py 20 999
但是假如使用两个横杠的 name,直接传入参数会报错,需要在传入参数的时候重写 name。例如下列代码
parser = argparse.ArgumentParser(description='PyTorch MNIST pruning from deep compression paper')parser.add_argument("--square", help="display a square of a given number", type=int)parser.add_argument("--number", help="display a given number", type=int)args = parser.parse_args()print(args.square**2)print(args.number)
命令行执行时需要
python mycode.py --square 20 --number 999
另外一个需要提到的点是name的取名时,字符串中的横杠和下划线似乎是等价的。例如
parser.add_argument('--batch_size', type=int, default=50)
和
parser.add_argument('--batch-size', type=int, default=50)
是等价的。但是传递参数的时候,name是横杠也得用横杠;name是下划线也得用下划线:
parser.add_argument('--batch_size', type=int, default=50)$ python mycode.py --batch_size 128
或者
parser.add_argument('--batch-size', type=int, default=50)$ python mycode.py --batch-size 128
调用的时候统一用下划线:
print(args.batch_size)
个人建议传递 name 的时候还是用下划线别用横杠,方便查找。这里 default 用于定义没有传递参数时,该参数的默认值。需要注意的是,name 参数用横杠的名称的时候设置default 值,命令行执行程序的时候可以不传入参数或者传入部分参数,没传入的参数使用默认值;name 参数用没有横杠的名称的时候,必须传入参数。
4. action 参数
下面的 parser.add_argument() 用到了 action 参数:
parser.add_argument('--no-cuda', action='store_true',help='disables CUDA training')
action=’store_true’ 表示如果我们在命令行配置这个参数,则该参数为 True;不配置则默认为 False。类似的 action=’store_false’ 表示如果我们在命令行配置这个参数,则该参数为 False;不配置则默认为 True。配置 action 类型的参数不需要传入具体的数值或者字符串,例如上例中,只需要
python mycode.py ----no-cuda
则表示对该参数进行了配置,他会被设为 True。更多 action 的类型可以参考官方文档
5. metavar 参数
metavar 参数只对用 parser.print_help() 打印参数信息的时候会有影响,并不影响程序的其他功能。例如
parser = argparse.ArgumentParser(description='PyTorch MNIST pruning from deep compression paper')parser.add_argument('--batch_size', type=int, default=50, help='input batch size for training (default: 50)')args = parser.parse_args()parser.print_help()
打印结果为:
usage: day1.py [-h] [--batch_size BATCH_SIZE]PyTorch MNIST pruning from deep compression paperoptional arguments:-h, --helpshow this help message and exit--batch_size BATCH_SIZEinput batch size for training (default: 50)
假如设置 metavar 参数:
parser = argparse.ArgumentParser(description='PyTorch MNIST pruning from deep compression paper')parser.add_argument('--batch_size', type=int, default=50, metavar='N',help='input batch size for training (default: 50)')args = parser.parse_args()parser.print_help()
打印结果为
usage: day1.py [-h] [--batch_size N]PyTorch MNIST pruning from deep compression paperoptional arguments:-h, --helpshow this help message and exit--batch_size Ninput batch size for training (default: 50)
可见,只是改变了一些参数的显示。
6. nagrs 参数
为传递多个参数,可以用 nagrs。当 nargs 为 1 时,有且只能传入一个参数:
import argparseparser = argparse.ArgumentParser()parser.add_argument('--one', nargs=1, required=True)args = parser.parse_args()print(args.one)
输出
python mycode.py --one1['1']
当 nargs 为其他数值,例如3时,表示必须传入3个参数:
import argparseparser = argparse.ArgumentParser()parser.add_argument('--three', nargs=3, required=True)args = parser.parse_args()print(args.three)
输出
python mycode.py --three1 2 3['1', '2', '3']
当设置了 nargs 参数,则输出是一个 list。
7. dest 参数
dest 参数可以改变 argparse.ArgumentParser() 对应的参数调用时候的名称。例如下面这一段
import argparseparser = argparse.ArgumentParser(description='Process some integers.')parser.add_argument('integers', metavar='N', type=int, nargs='+',help='an integer for the accumulator')parser.add_argument('--sum', dest='accumulate', action='store_const',const=sum, default=max,help='sum the integers (default: find the max)')args = parser.parse_args()print(args.accumulate(args.integers))
如果第二个参数没有 dest=‘accumulate’,则在调用的时候,最后一行代码只能是
print(args.sum(args.integers))
dest 使得它在调用的时候被改名。但要注意在命令行传入参数的时候仍然是用name的字符串,即–sum。
Reference
[1] 官方文档
[2] 命令行传递参数 argparse.ArgumentParser解析
[3] argparse.ArgumentParser()用法解析