学习pyhton: argparse模块

2018-11-16  本文已影响10人  张王李刘赵孙杨

简介

当遇到需要参数的情况时,往往有以下三种处理方法[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)

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

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

add_argument()方法

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

各个参数含义如下:

最后来个示范

常用的参数基本都列出来了,接下来用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. 官方文档
上一篇 下一篇

猜你喜欢

热点阅读