学习pyhton: argparse模块

简介

当遇到需要参数的情况时,往往有以下三种处理方法[1]:
直接给定
这种方法实现起来方便,但是灵活性稍差,每次都需要打开源码修改。
手动解析
这种方法也算是比较常用,但是当参数过多时就显示出来不方便了,因为每次输入的格式以及参数的个数都必须一点不差。举个简单的小例子说明这种方法如何使用:
# python 代码-手动解析参数
# 文件名称test.py

    import sys

    if __name__ == '__main__':
        print sys.argv[0]
        print "end"
    $python test.py 1 
    test.py 
    end 

自动解析
相比上述两种方法,这种自动解析的方法更加灵活,且参数可以选择,顺序可以不确定,因此建议使用这种方法。其主要依赖python包argparse


接下来主要介绍python命令行解析模块argparse***[2][3]***:
argparse 模块使得用户友好的命令行编程更加方便。首先定义程序中需要什么参数,然后argparse会自动从sys.argv中解析之前定义的参数。
argparse还可以自动生成帮助文档,并且当用户输入错误的参数时自动报错。

来个例子

# python代码 - argparse 示例
# 代码名称: prog.py
import argparse

parser = 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))

命令行运行如下命令可以查看帮助信息:

$ python prog.py -h
usage: prog.py [-h] [--sum] N [N ...]

Process some integers.

positional arguments:
 N           an integer for the accumulator

optional arguments:
 -h, --help  show this help message and exit
 --sum       sum the integers (default: find the max)

使用合适的参数运行程序,可以得到输入参数的max或者sum,如果输入不合适的参数,则程序会直接报错,如下:

$ python prog.py 1 2 3 4
4

$ python prog.py 1 2 3 4 --sum
10

$ python prog.py a b c
usage: prog.py [-h] [--sum] N [N ...]
prog.py: error: argument N: invalid int value: 'a'

创建一个解释器

>>>parser = argparse.ArgumentParser(description='Process some integers.')

ArgumentParser对象存储了解析命令行参数所需的所有信息。

添加参数

add_argument()函数实现了将需要的参数添加到ArgumentParser对象中。
这些调用告诉ArgumentParse对象怎样提取命令行中的参数,并如何将其转化为所需的对象。This information is stored and used when parse_args()is called. For example:

>>>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)')

调用完parse_args()函数后会返回两个对象,integersaccumulate
integers是一个或多个(list)int型的数;
accumulate是一个sum()函数(--sum已调用),或者max()(--sum没调用)

解析参数

>>> parser.parse_args(['--sum', '7', '-1', '42'])
Namespace(accumulate=<built-in function sum>, integers=[7, -1, 42])

注意: 在一个script中,parse_args()函数一般不带参数直接调用,而参数是直接在命令行中给出,然后ArgumentParser会在sys.argv中自动解析相应的参数。

ArgumentParser对象

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)

其每一个参数的定义如下:

  • prog - The name of the program (default: sys.argv[0])
    默认情况下, ArgumentParser对象根据sys.argv[0]的值(不包括路径名)生成帮助信息中的程序名。

  • usage - The string describing the program usage (default: generated from arguments added to parser)
    默认情况下,ArgumentParser对象可以根据参数自动生成用法信息

  • description - Text to display before the argument help (default: none)
    description 用于展示程序的简要介绍信息,通常包括:这个程序可以做什么、怎么做。在帮助信息中 description位于用法信息与参数说明之间

  • epilog - Text to display after the argument help (default: none)
    与description类似,程序的额外描述信息,位于参数说明之后

  • parents - A list of ArgumentParser objects whose arguments should also be included
    有时多个解析器可能有相同的参数集,为了实现代码复用,我们可以将这些相同的参数集提取到一个单独的解析器中,在创建其它解析器时通过parents指定父解析器,这样新创建的解析器中就包含了相同的参数集。

  • formatter_class - A class for customizing the help output
    通过 formatter_class 可以定制帮助信息

  • prefix_chars - The set of characters that prefix optional arguments (default: ‘-‘)
    一般情况下,我们使用’-‘作为选项前缀,ArgumentParser也支持自定义选项前缀,通过prefix_chars

  • fromfile_prefix_chars - The set of characters that prefix files from which additional arguments should be read (default: None)

  • argument_default - The global default value for arguments (default: None)

  • conflict_handler - The strategy for resolving conflicting optionals (usually unnecessary)

  • add_help - Add a -h/–help option to the parser (default: True)
    是否禁用-h –help选项

个人认为常用的参数使用黑体标出,基本上如果没有特别需求就指定一下description就可以了。
官网和一些参考文献中都给出了每个参数的详细定义和具体使用方法,这里不在赘述。

add_argument()方法

ArgumentParser.add_argument(name or flags…[, action][, nargs][, const][, default][, type][, choices][, required][, help][, metavar][, dest])

各个参数含义如下:

  • name or flags - Either a name or a list of option strings, e.g. foo or -f, --foo.
    指定一个可选参数或者位置参数。其中可选参数以-开头,剩下的是位置参数

  • action - The basic type of action to be taken when this argument is encountered at the command line.
    指定如何处理命令行参数

  • nargs - The number of command-line arguments that should be consumed.
    指定多个命令行参数和一个arcion相关联,具体见官方文档

  • const - A constant value required by some action and nargs selections.
    constant value,不是从命令行中读取,在某些特定action中需要指定。

  • default - The value produced if the argument is absent from the command line.
    如果参数可以缺省,default指定命令行参数不存在时的参数值。

  • type - The type to which the command-line argument should be converted.
    默认情况下,ArgumentParser对象将命令行参数保存为字符串。但通常命令行参数应该被解释为另一种类型,如 float或int。通过指定type,可以对命令行参数执行类型检查和类型转换

  • choices - A container of the allowable values for the argument.
    将命令行参数的值限定在一个范围内,超出范围则报错

  • required - Whether or not the command-line option may be omitted (optionals only).
    指定命令行参数是否必需,默认通过-f –foo指定的参数为可选参数。

  • help - A brief description of what the argument does.
    帮助文档

  • metavar - A name for the argument in usage messages.
    写帮助文档时可选的参数

  • dest - The name of the attribute to be added to the object returned by parse_args().
    dest 允许自定义ArgumentParser的参数属性名称

最后来个示范

常用的参数基本都列出来了,接下来用Pytorch源码中的一个小例子演示用法:

parser = argparse.ArgumentParser(description='PyTorch MNIST Example')
parser.add_argument('--batch-size', type=int, default=64, metavar='N',
                    help='input batch size for training (default: 64)')
parser.add_argument('--test-batch-size', type=int, default=1000, metavar='N',
                    help='input batch size for testing (default: 1000)')
parser.add_argument('--epochs', type=int, default=10, metavar='N',
                    help='number of epochs to train (default: 10)')
parser.add_argument('--lr', type=float, default=0.01, metavar='LR',
                    help='learning rate (default: 0.01)')
parser.add_argument('--momentum', type=float, default=0.5, metavar='M',
                    help='SGD momentum (default: 0.5)')
parser.add_argument('--no-cuda', action='store_true', default=False,
                    help='disables CUDA training')
parser.add_argument('--seed', type=int, default=1, metavar='S',
                    help='random seed (default: 1)')
parser.add_argument('--log-interval', type=int, default=10, metavar='N',
                    help='how many batches to wait before logging training status')
args = parser.parse_args()

参考:

  1. python 中的argparse
  2. python命令行解析模块argparse
  3. 官方文档
發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章