Python命令行参数解析模块 argparse

2018-12-14  本文已影响16人  Whyn

简介

Python 中自带的argparse模块可以用于提供简洁易用的命令行参数解析。

程序内部定义了需要使用的参数,argparse 会默认自动从 sys.argv中解析出对应的参数。argparse模块会自动生成帮助信息和使用提示,同时当用户使用无效参数时,会显示错误原因。

注: Python 中还有其他两个模块可以提供相同的命令行参数解析功能:getopt(等同于 C 语言的getopt())和optparse(Python2.7以后被标记为 Deprecated,不会继续发展)。
其中,argparse是基于optparse的进一步封装,因此这两者拥有相似的使用方法。

参数类型说明

命令行参数类型可以分为以下两种:

命令行参数通用格式为:program [optional] positional

简单示例

下面列举一些简单的例子,力求对 argparse有一个初步的了解。更多详细的示例,请参考:Argparse Tutorial

示例1. 添加一个位置参数:square,其类型为int

import argparse
#创建一个参数解析实例
parser = argparse.ArgumentParser()
#添加参数解析
parser.add_argument("square", help="display a square of a given number",
                    type=int)
#开始解析
args = parser.parse_args()
print(args.square**2)

上述代码生成的程序使用格式为:usage: argTest.py [-h] square,因此具体使用应类似:$ python3 argTest.py 4

argparse中参数类型默认为字符串(string),可以通过type参数指定参数类型。

实例2. 添加一个可选参数:-v/--verbose:

import argparse
parser = argparse.ArgumentParser()
parser.add_argument("-v", "--verbose", help="increase output verbosity")
args = parser.parse_args()
if args.verbose:
    print("verbosity turned on")

上述代码生成的程序使用格式为:usage: argTest.py [-h] [-v VERBOSE],可选参数-v/--verbose后面必须加上一个值(任意类型)。因此具体使用应类似:

$ python3 argTest.py -v 1
verbosity turned on
$ python3 argTest.py --verbose haha
verbosity turned on

通常程序的可选参数表现形式为布尔值类型:TrueFalse。可以通过在方法add_argument中为参数加上参数action进行指定。

实例3. 为程序添加一个位置参数:square,类型为int;同时添加一个布尔类型的可选参数:-v/--verbose:

import argparse
parser = argparse.ArgumentParser()
parser.add_argument("square", type=int,
                    help="display a square of a given number")
parser.add_argument("-v", "--verbose", action="store_true",
                    help="increase output verbosity")
args = parser.parse_args()
answer = args.square**2
if args.verbose:
    print("the square of {} equals {}".format(args.square, answer))
else:
    print(answer)

上述代码生成的程序使用格式为:usage: argTest.py [-h] [-v] square,因此具体使用应类似:

$ python3 argTest.py
usage: argTest.py [-h] [-v] square
argTest.py: error: the following arguments are required: square
$ python3 argTest.py 4
16
$ python3 argTest.py 4 --verbose
the square of 4 equals 16
$ python3 argTest.py --verbose 4
the square of 4 equals 16

action="store_true"表示当显示指定了可选参数时,其值为True,当未指定时,则为False
action="store_false"与之相反,当未指定参数时,其值为True,当显示指定参数时,其值为False

关键函数讲解

从上面的示例中我们可以看到,argparse主要涉及到3个调用:

Argument Description
prog 应用名称(默认:sys.argv[0]
usage 程序使用方法描述
description 显示在参数列表帮助信息之前的文本展示(默认:无)
epilog 显示在参数列表帮助信息之后的文本展示(默认:无)
parents 需要同时添加的一系列ArgumentParser对象
formatter_class 自定义帮助信息输出的类
prefix_chars 可选参数前缀字符(默认:‘-‘)
fromfile_prefix_chars 参数文件集前缀字符(默认:无)
argument_default 全局参数默认值(默认:无)
conflict_handler 可选参数冲突解决策略(通常不需要)
add_help 为解析器增加一个-h/--help选项(默认:True
allow_abbrev 允许长选项简短表示,只要简短表示不具备二义性(默认:True

:所有参数均为 关键字参数,需以键值对形式进行传参。

Argument Description
name or flags 一个名称或则参数字符串列表。e.g. foo or -f, --foo
action 对该参数的处理动作
nargs 提取的命令行参数对应的值的个数
const 如果命令行没有传入该参数,const指定该参数的默认值,在某些action与nargs类型下才起作用
default 命令行中如果缺少该参数,则使用该 default 指定的值
type 参数应转化成的类型
choices 参数允许的值
required 表明参数是否是必须的,只对可选参数有效
help 参数对应的简短描述
metavar 在使用信息中该参数对应的名称
dest parse_args()返回的对象对应的属性名称

其中:
action 有如下几个选项:

>>> parser = argparse.ArgumentParser()
>>> parser.add_argument('--foo')
>>> parser.parse_args('--foo 1'.split())
Namespace(foo='1')
>>> parser = argparse.ArgumentParser()
>>> parser.add_argument('--foo', action='store_const', const=42)
>>> parser.parse_args(['--foo'])
Namespace(foo=42)
>>> parser = argparse.ArgumentParser()
>>> parser.add_argument('--foo', action='store_true')
>>> parser.add_argument('--bar', action='store_false')
>>> parser.add_argument('--baz', action='store_false')
>>> parser.parse_args('--foo --bar'.split())
Namespace(foo=True, bar=False, baz=True)
>>> parser = argparse.ArgumentParser()
>>> parser.add_argument('--foo', action='append')
>>> parser.parse_args('--foo 1 --foo 2'.split())
Namespace(foo=['1', '2'])
>>> parser = argparse.ArgumentParser()
>>> parser.add_argument('--str', dest='types', action='append_const', const=str)
>>> parser.add_argument('--int', dest='types', action='append_const', const=int)
>>> parser.parse_args('--str --int'.split())
Namespace(types=[<class 'str'>, <class 'int'>])
>>> parser = argparse.ArgumentParser()
>>> parser.add_argument('--verbose', '-v', action='count')
>>> parser.parse_args(['-vvv'])
Namespace(verbose=3)
>>> import argparse
>>> parser = argparse.ArgumentParser(prog='PROG')
>>> parser.add_argument('--version', action='version', version='%(prog)s 2.0')
>>> parser.parse_args(['--version'])
PROG 2.0

nargs 有如下几个选项:

>>> parser = argparse.ArgumentParser()
>>> parser.add_argument('--foo', nargs=2)
>>> parser.add_argument('bar', nargs=1)
>>> parser.parse_args('c --foo a b'.split())
Namespace(bar=['c'], foo=['a', 'b'])
>>> parser = argparse.ArgumentParser()
>>> parser.add_argument('--foo', nargs='?', const='c', default='d')
>>> parser.add_argument('bar', nargs='?', default='d')
>>> parser.parse_args(['XX', '--foo', 'YY'])
Namespace(bar='XX', foo='YY')
>>> parser.parse_args(['XX', '--foo'])
Namespace(bar='XX', foo='c')
>>> parser.parse_args([])
Namespace(bar='d', foo='d')
>>> parser = argparse.ArgumentParser()
>>> parser.add_argument('--foo', nargs='*')
>>> parser.add_argument('--bar', nargs='*')
>>> parser.add_argument('baz', nargs='*')
>>> parser.parse_args('a b --foo x y --bar 1 2'.split())
Namespace(bar=['1', '2'], baz=['a', 'b'], foo=['x', 'y'])
>>> parser = argparse.ArgumentParser(prog='PROG')
>>> parser.add_argument('foo', nargs='+')
>>> parser.parse_args(['a', 'b'])
Namespace(foo=['a', 'b'])
>>> parser.parse_args([])
usage: PROG [-h] foo [foo ...]
PROG: error: the following arguments are required: foo
>>> parser = argparse.ArgumentParser(prog='PROG')
>>> parser.add_argument('--foo')
>>> parser.add_argument('command')
>>> parser.add_argument('args', nargs=argparse.REMAINDER)
>>> print(parser.parse_args('--foo B cmd --arg1 XX ZZ'.split()))
Namespace(args=['--arg1', 'XX', 'ZZ'], command='cmd', foo='B')

如果nargs关键字参数未提供,则读取的参数个数由action决定。通常这意味着将读取一个命令行参数并产生一个元素(不是一个列表)。

参考

上一篇 下一篇

猜你喜欢

热点阅读