python argparse使用

介绍

在终端运行python程序,会出现需要参数的需求,我们可以自己解析sys.argv中传递的参数,但python提供了更好的方式argparse模块中的ArgumentParser类。

我们要做的就是实例化ArgumentParser,然后调用parse_args方法就可以使用。
下面是一个简单的栗子

from argparse import ArgumentParser
import sys

parser = ArgumentParser()

parser.parse_args(sys.argv[1:])

在终端执行文件加上--help或者-h参数,就可以获得说明,是不是很酷!

D:\desktop>python argparseLearn.py  --help
usage: argparseLearn.py [-h]

optional arguments:
  -h, --help  show this help message and exit

当然,我们作为厉害的python程序编写者,仅仅提供一个--help参数肯定是不够的,可以利用add_argument方法增加参数,又到了foo参数上场的时候了

parser.add_argument('--foo',help='foo help')
D:\desktop>python argparseLearn.py  --help
usage: argparseLearn.py [-h] [--foo FOO]

optional arguments:
  -h, --help  show this help message and exit
  --foo FOO   foo help

D:\desktop>python argparseLearn.py  --foo 3
Namespace(foo='3')

到这里,ArgumentParser最基本的用法我们已经掌握了

修改显示界面

通过添加初始化参数,能够让我们的参数帮助界面更人性化
prog参数可以修改程序显示名称
description可以添加描述信息
usage修改usage信息,会覆盖prog参数
epilog在末尾添加帮助信息

parser = ArgumentParser(description = 'owen introduce',prog='argparseLearn',usage='try to use',epilog='thus is the end')
usage: try to use

owen introduce

optional arguments:
  -h, --help  show this help message and exit
  --foo FOO   foo help

thus is the end

还有一些其他参数:

add_help = False  禁止显示帮助界面,只接收参数
argument_default=argparse.SUPPRESS  限制只能从命令行传递参数,程序中指定无效
allow_abbrev=False  例如--fooo,输入--foo,则不可以识别参数,默认可以
conflict_handler='resolve'   若参数重名,则不报错
add_help = False   optional arguments中的help信息不会显示

add_argument方法

参数类型

add_argument中参数有两种,一种是加前缀'-'或者'--'叫做可选参数,一种是不加前缀叫做位置参数,如果位置参数不传变量,则报错。

parser.add_argument('-foo',help='foo help')
parser.add_argument('bar',help='bar help')
D:\desktop>python argparseLearn.py  3
Namespace(bar='3', foo=None)

D:\desktop>python argparseLearn.py
usage: argparseLearn.py [-h] [-foo FOO] bar
argparseLearn.py: error: the following arguments are required: bar

参数默认值

store_const - add_argument中默认action=’store‘,直接保存从运行终端或程序中传入的变量。
如果想修改为常量,需要修改action='store_const',然后指定const

parser.add_argument('--foo', action='store_const', const=42)
D:\desktop>python argparseLearn.py  --foo
Namespace(foo=42)

store_true/false - 如果需要存储True或者False,只要指定action='store_true/false'

parser.add_argument('--foo', action='store_true')
parser.add_argument('--foo', action='store_false')
D:\desktop>python argparseLearn.py  --foo
Namespace(foo=True)

需要注意的是,如果指定action为store_const或者store_true,则参数不可再进行赋值

D:\desktop>python argparseLearn.py  --foo  3
usage: argparseLearn.py [-h]
argparseLearn.py: error: unrecognized arguments: --foo 3

append - 同一参数,需要多个值时候,需要指定action='append'

parser.add_argument('--foo', action='append')
D:\desktop>python argparseLearn.py  --foo 1 --foo 2
Namespace(foo=['1', '2'])

dest - 如果想要修改变量名,使用dest

parser.add_argument('--foo',dest='oop'
D:\desktop>python argparseLearn.py  --foo  3
Namespace(oop='3')

version - 需要指定action='version',打印version后会自动退出

parser.add_argument('--version',action='version',version='PROG 2.0')
D:\desktop>python argparseLearn.py  --version
PROG 2.0

更酷的是,我们可以直接覆盖的argparse.Action的initcall方法来自定义action,我们限制dest不能为oop,否则报错ValueError

class FooAction(Action):
    def __init__(self,option_strings,dest,nargs=None,**kwargs):
        if dest=='oop':
            raise ValueError('name oop is not allowed')
        super().__init__(option_strings, dest, **kwargs)
    def __call__(self,parser,namespace,values,option_strings=None):    
        setattr(namespace,self.dest,values)
parser.add_argument('--foo',action=FooAction,dest='oop')
D:\desktop>python argparseLearn.py  --foo 3
Traceback (most recent call last):
  File "argparseLearn.py", line 13, in 
    parser.add_argument('--foo',action=FooAction,dest='opp')
  File "D:\python37\lib\argparse.py", line 1353, in add_argument
    action = action_class(**kwargs)
  File "argparseLearn.py", line 6, in __init__
    raise ValueError('name oop is not allowed')
ValueError: name oop is not allowed

参数个数

nargs - 可以指定一个参数可以具体有几个变量

parser.add_argument('--foo',nargs=2)
D:\desktop>python argparseLearn.py  --foo 3 2
Namespace(foo=['3', '2'])

当然会出现希望有一个以上以及无数个变量的情况,这时候就需要通配符
+一个变量及以上
?0或1个变量
*0或任意个变量

parser.add_argument('--foo',nargs='+')
D:\desktop>python argparseLearn.py  --foo 3  3  3
Namespace(foo=['3', '3', '3'])

argparse.REMAINDER - 可以将可选参数和位置参数之外的参数保存到一起

parser.add_argument('--foo')
parser.add_argument('bar')
parser.add_argument('args', nargs=argparse.REMAINDER)
D:\desktop>python argparseLearn.py   --foo  3  9 3 1
Namespace(args=['3', '1'], bar='9', foo='3')

这种情况下,需要将bar的参数3写在后面,否则包括foo都变成可选参数

D:\desktop>python argparseLearn.py  9  --foo  3   3 1
Namespace(args=['--foo', '3', '3', '1'], bar='9', foo=None)

default - 不同于 action='store_const'的不可修改,default在指定默认值的同时,是可以修改的

parser.add_argument('--foo',default=3)
D:\desktop>python argparseLearn.py  --foo 32
Namespace(foo='32')

D:\desktop>python argparseLearn.py
Namespace(foo=3)

type - 默认从终端或者程序读取的都是字符串,可以通过type修改类型

parser.add_argument('--foo',type=list)
D:\desktop>python argparseLearn.py   --foo 1
Namespace(foo=['1'])

choices - 限制变量只能在choice中

parser.add_argument('--foo', choices=['rock', 'paper', 'scissors'])
D:\desktop>python argparseLearn.py   --foo 1
usage: PROG [-h] [--foo {rock,paper,scissors}]
PROG: error: argument --foo: invalid choice: '1' (choose from 'rock', 'paper', 'scissors')

required - 可以通过required将可选参数设定为必须输入变量

parser.add_argument('--foo', required=True)
D:\desktop>python argparseLearn.py
usage: PROG [-h] --foo FOO
PROG: error: the following arguments are required: --foo

metavar - 修改参数需要变量的信息,只是作为显示使用

parser.add_argument('--foo')
D:\desktop>python argparseLearn.py    -h
usage: PROG [-h] [--foo FOO]

optional arguments:
  -h, --help  show this help message and exit
  --foo FOO
parser.add_argument('--foo',metavar=('var'))
usage: PROG [-h] [--foo var]

optional arguments:
  -h, --help  show this help message and exit
  --foo var

你可能感兴趣的:(python argparse使用)