python中命令行工具模块argparse的使用

跑机器学习或深度学习实验的时候经常需要调各种参数,当把代码部署到服务器上时,如果直接在代码中改参数的大小,非常不方便,如果用argparse模块通过命令行传递参数到程序中,会使代码更方便简洁有序。

argparse是python用于解析命令行参数和选项的标准模块,类似于linux中的ls指令,后面可以跟着不同的参数选项以实现不同的功能,argparse就可以解析命令行然后执行相应的操作。

argparse 使用简介

使用argparse 配置命令行参数时,需要三步:

  1. 首先导入argparse模块
  2. 创建 ArgumentParser() 对象
  3. 调用 add_argument() 方法添加参数
  4. 使用 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() 的调用完全决定了创建什么对象以及如何设置。

扫描二维码关注公众号,回复: 10227587 查看本文章

选项值语法,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如何传入列表作为参数

发布了143 篇原创文章 · 获赞 161 · 访问量 29万+

猜你喜欢

转载自blog.csdn.net/vivian_ll/article/details/103239271