跑机器学习或深度学习实验的时候经常需要调各种参数,当把代码部署到服务器上时,如果直接在代码中改参数的大小,非常不方便,如果用argparse模块通过命令行传递参数到程序中,会使代码更方便简洁有序。
argparse是python用于解析命令行参数和选项的标准模块,类似于linux中的ls指令,后面可以跟着不同的参数选项以实现不同的功能,argparse就可以解析命令行然后执行相应的操作。
argparse 使用简介
使用argparse 配置命令行参数时,需要三步:
- 首先导入argparse模块
- 创建 ArgumentParser() 对象
- 调用 add_argument() 方法添加参数
- 使用 parse_args() 解析添加的参数
举例如下:
import argparse
parser = argparse.ArgumentParser(description='BMD prediction')
parser.add_argument('--model-name', type=str, default='model', metavar='S',
help='model name')
parser.add_argument('--batch-size', type=int, default=1, metavar='N', # 64
help='input batch size for training')
parser.add_argument('--no-cuda', action='store_true', default=False,
help='disables CUDA training')
parser.add_argument('--vocab', nargs='+', required=True, metavar='WORD_VOCAB TAG_VOCAB PUNCTAG_VOCAB',
help='src vocab and tags vocab')
parser.add_argument('--dataset', type=str, default='D:/Data/DataAndLabel/test-data-new.txt', metavar='DATASET',
help='dataset path')
def main(args):
train(args.model_name)
...
if __name__ == '__main__':
main(parser.parse_args())
方法参数说明
1. ArgumentParser类
一般我们只选择用description。
class ArgumentParser(_AttributeHolder, _ActionsContainer):
def __init__(self,
prog=None,
usage=None,
description=None,
epilog=None,
version=None,
parents=[],
formatter_class=HelpFormatter,
prefix_chars='-',
fromfile_prefix_chars=None,
argument_default=None,
conflict_handler='error',
add_help=True):
参数:
- prog - 程序的名字(默认:sys.argv[0])
- usage - 描述程序用法的字符串(默认:从解析器的参数生成)
- description - 参数帮助信息之前的文本(默认:空)
- epilog - 参数帮助信息之后的文本(默认:空)
- parents - ArgumentParser 对象的一个列表,这些对象的参数应该包括进去
- formatter_class - 定制化帮助信息的类
- prefix_chars - 可选参数的前缀字符集(默认:‘-‘)
- fromfile_prefix_chars - 额外的参数应该读取的文件的前缀字符集(默认:None)
- argument_default - 参数的全局默认值(默认:None)
- conflict_handler - 解决冲突的可选参数的策略(通常没有必要)
- add_help - 给解析器添加-h/–help 选项(默认:True)
2. ArgumentParser对象add_argument()方法
python现在的版本,标准库调整了这个地方的文档/说明。之前的文档如下:
ArgumentParser.add_argument(name or flags…[, action][, nargs][, const][, default][, type][, choices][, required][, help][, metavar][, dest])
参数
- name or flags:传递给add_argument() 的第一个参数。因此必须是一个标记序列或者一个简单的参数名字
- action:指出应该如何处理命令行参数,支持的操作:’store’(默认),’store_const’,’store_true’,’store_false’,’append’,’append_const’,’count’,’help’,’version’,可以继承 argparse.Action 定制自己的 action 。
- nargs:将一个动作与不同数目的命令行参数关联在一起,即设置一个参数后面可以接收几个值,而且提供了类似于正则的符号来通配一些行为。(支持的值:N,’?’,’*’,’+’)
- const:用于保存常量值,它们不是从命令行读入但是是ArgumentParser 的动作所要求的。
- default:其默认值为None,指出如果命令行参数没有出现时它们应该是什么值。
- type:允许任意必要的类型检查并作类型转换。
- choices:可以设置填入的参数在 choices 指定的范围内。
- required:如果要使得选项是必需的,可以指定True,作为required=关键字参数的值给add_argument()。等于True时,传入的时候没有将报出一个错误。
- help:包含参数简短描述的字符串。
- metavar:默认情况下,对于位置参数直接使用dest的值,对于可选参数则将dest的值变为大写。注意metavar只会改变显示出来的名字,parse_args() 对象中属性的名字仍然由dest的值决定。所以可以理解为参数的名字,在显示帮助信息时才用到。
- dest:设置这个选项的value解析出来后放到哪个属性中。
3. ArgumentParser对象parse_args()方法
将参数字符串转换成对象并设置成命名空间的属性。返回构成的命名空间。
之前对add_argument() 的调用完全决定了创建什么对象以及如何设置。
选项值语法,parse_args()方法支持几种指定一个选项的值的方法:
- 最简单的方法是,将选项和它的值以两个分开的参数传递
- 对于长选项(名字长度超过一个字符的选项),选项和它的值还可以用一个单一的命令行参数传递,并用=分隔它们
- 对于短选项(长度只有一个字符的选项),选项及其值可以连在一起
- 几个短选项可以连在一起仅使用一个-前缀,只要只有最后一个选项要求有值或者都不要有值
无效参数
在解析命令行的同时,parse_args()会检查各种错误,包括有歧义的选项、不合法的类型、不合法的选项、错误的位置参数个数等等。当它遇到此类错误时,会退出并跟随用法信息一起打印出错误。
4. class argparse.Namespace
parse_args() 默认使用的简单的类,用于创建一个保存属性的对象并返回该对象。
有时可能需要让ArgumentParser分配属性给一个已经存在的对象而不是一个新的Namespace对象。这可以通过指定namespace=关键字参数达到。
argparse传入列表作为参数
import argparse
parser = argparse.ArgumentParser()
# By default it will fail with multiple arguments.
parser.add_argument('--default')
# Telling the type to be a list will also fail for multiple arguments,
# but give incorrect results for a single argument.
parser.add_argument('--list-type', type=list)
# This will allow you to provide multiple arguments, but you will get
# a list of lists which is not desired.
parser.add_argument('--list-type-nargs', type=list, nargs='+')
# This is the correct way to handle accepting multiple arguments.
# '+' == 1 or more.
# '*' == 0 or more.
# '?' == 0 or 1.
# An int is an explicit number of arguments to accept.
parser.add_argument('--nargs', nargs='+')
# To make the input integers
parser.add_argument('--nargs-int-type', nargs='+', type=int)
# An alternate way to accept multiple inputs, but you must
# provide the flag once per input. Of course, you can use
# type=int here if you want.
parser.add_argument('--append-action', action='append')
# To show the results of the given option to screen.
for _, value in parser.parse_args()._get_kwargs():
if value is not None:
print(value)
输出如下:
$ python arg.py --default 1234 2345 3456 4567
...
arg.py: error: unrecognized arguments: 2345 3456 4567
$ python arg.py --list-type 1234 2345 3456 4567
...
arg.py: error: unrecognized arguments: 2345 3456 4567
$ # Quotes won't help here...
$ python arg.py --list-type "1234 2345 3456 4567"
['1', '2', '3', '4', ' ', '2', '3', '4', '5', ' ', '3', '4', '5', '6', ' ', '4', '5', '6', '7']
$ python arg.py --list-type-nargs 1234 2345 3456 4567
[['1', '2', '3', '4'], ['2', '3', '4', '5'], ['3', '4', '5', '6'], ['4', '5', '6', '7']]
$ python arg.py --nargs 1234 2345 3456 4567
['1234', '2345', '3456', '4567']
$ python arg.py --nargs-int-type 1234 2345 3456 4567
[1234, 2345, 3456, 4567]
$ # Negative numbers are handled perfectly fine out of the box.
$ python arg.py --nargs-int-type -1234 2345 -3456 4567
[-1234, 2345, -3456, 4567]
$ python arg.py --append-action 1234 --append-action 2345 --append-action 3456 --append-action 4567
['1234', '2345', '3456', '4567']
参考网址:
python中的argparse模块使用
Python 命令行工具 argparse 模块使用详解
python3中argparse模块详解
python中argparse如何传入列表作为参数