This tutorial is intended to be a gentle introduction to argparse
, the recommended command-line parsing module in the Python standard library.
这篇教程旨在作为 argparse
的入门介绍,此模块是 Python 标准库中推荐的命令行解析模块。
–help
import argparse
parser = argparse.ArgumentParser()
parser.parse_args() #需要,否则使用-h无输出
以下是该代码的运行结果:
$ python3 prog.py
$ python3 prog.py --help
usage: prog.py [-h]
optional arguments:
-h, --help show this help message and exit
$ python3 prog.py --verbose
usage: prog.py [-h]
prog.py: error: unrecognized arguments: --verbose
$ python3 prog.py foo
usage: prog.py [-h]
prog.py: error: unrecognized arguments: foo
--help
选项,也可缩写为 -h
,是唯一一个可以直接使用的选项(即不需要指定该选项的内容)。
位置参数(positional arguments)
import argparse
parser = argparse.ArgumentParser()
parser.add_argument("echo")
args = parser.parse_args()
print(args.echo)
运行此程序:
$ python3 prog.py
usage: prog.py [-h] echo
prog.py: error: the following arguments are required: echo
$ python3 prog.py --help
usage: prog.py [-h] echo
positional arguments:
echo
optional arguments:
-h, --help show this help message and exit
$ python3 prog.py foo
foo
- 我们增加了
add_argument()
方法,该方法用于指定程序能够接受哪些命令行选项。在这个例子中,我将选项命名为echo
,与其功能一致。即print(args.echo)
语句实现。 - 现在调用我们的程序必须要指定一个选项。即给定该位置参数的值,如
foo
。 parser.parse_args()
返回选项的指定值。即args.echo
的值为foo
。
在本例中,我们可以知道 echo
是一个位置参数,但没法知道它是用来干什么的。所以,我们可以把它改造得更有用:
parser.add_argument("echo", help="echo the string you use here")
下面是一个计算平方数的示例:
argparse
会把我们传递给它的选项视作为字符串,我们需要告诉 argparse
来把这一输入视为整数:
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)
以下是该代码的运行结果:
$ python3 prog.py 4
16
$ python3 prog.py four
usage: prog.py [-h] square
prog.py: error: argument square: invalid int value: 'four'
当这个程序在收到错误的无效的输入时,它甚至能在执行计算之前先退出,还能显示很有帮助的错误信息。
可选参数(optional arguments)
import argparse
parser = argparse.ArgumentParser()
parser.add_argument("--verbosity", help="increase output verbosity")
args = parser.parse_args()
if args.verbosity:
print("verbosity turned on")
输出:
$ python3 prog.py --verbosity 1
verbosity turned on
$ python3 prog.py
$ python3 prog.py --help
usage: prog.py [-h] [--verbosity VERBOSITY]
optional arguments:
-h, --help show this help message and exit
--verbosity VERBOSITY
increase output verbosity
$ python3 prog.py --verbosity
usage: prog.py [-h] [--verbosity VERBOSITY]
prog.py: error: argument --verbosity: expected one argument
- 这一程序被设计为当指定
--verbosity
选项时显示某些东西,否则不显示。 - 不添加这一选项时程序没有提示任何错误而退出,表明这一选项确实是可选的。注意,如果一个可选参数没有被使用时,相关变量被赋值为
None
。即if args.verbosity:
为假。 - 帮助信息有点不同。
- 使用
--verbosity
选项时,必须指定一个值,但可以是任何值。
上述例子接受任何数值作为 --verbosity
的参数,但对于我们的简单程序而言,只有两个值有实际意义:True
或者 False
。让我们据此修改代码:
import argparse
parser = argparse.ArgumentParser()
parser.add_argument("--verbose", help="increase output verbosity",
action="store_true")
args = parser.parse_args()
if args.verbose:
print("verbosity turned on")
else:
print("verbosity turned off")
输出:
$ python3 prog.py
verbosity turned off
$ python3 prog.py --verbose
verbosity turned on
$ python3 prog.py --verbose 1
usage: prog.py [-h] [--verbose]
prog.py: error: unrecognized arguments: 1
$ python3 prog.py --help
usage: prog.py [-h] [--verbose]
optional arguments:
-h, --help show this help message and exit
--verbose increase output verbosity
- 现在,这一选项更多地是一个标志,而非需要接受一个值的什么东西。我们甚至改变了选项的名字来符合这一思路。注意我们现在指定了一个新的关键词
action
,并赋值为"store_true"
。这意味着,当这一选项存在时,为args.verbose
赋值为True
。没有指定时则隐含地赋值为False
。 - 当你为其指定一个值时,它会报错,这符合作为标志的真正的精神。
- 留意不同的帮助文字。即
--verbosity VERBOSITY
和--verbose
短选项
parser.add_argument("-v", "--verbose", help="increase output verbosity",
action="store_true")
结合位置参数和可选参数
import argparse
parser = argparse.ArgumentParser()
parser.add_argument("square", type=int,
help="display a square of a given number")
parser.add_argument("-v", "--verbosity", type=int, choices=[0, 1, 2],
help="increase output verbosity")
args = parser.parse_args()
answer = args.square**2
if args.verbosity == 2:
print("the square of {} equals {}".format(args.square, answer))
elif args.verbosity == 1:
print("{}^2 == {}".format(args.square, answer))
else:
print(answer)
输出:
$ python3 prog.py 4
16
$ python3 prog.py 4 -v
usage: prog.py [-h] [-v VERBOSITY] square
prog.py: error: argument -v/--verbosity: expected one argument
$ python3 prog.py 4 -v 1
4^2 == 16
$ python3 prog.py 4 -v 2
the square of 4 equals 16
$ python3 prog.py 4 -v 3
usage: prog.py [-h] [-v {0,1,2}] square
prog.py: error: argument -v/--verbosity: invalid choice: 3 (choose from 0, 1, 2)
$ python3 prog.py 4 -h
usage: prog.py [-h] [-v {0,1,2}] square
positional arguments:
square display a square of a given number
optional arguments:
-h, --help show this help message and exit
-v {0,1,2}, --verbosity {0,1,2}
increase output verbosity
可以通过choices=[0, 1, 2]
指定--verbosity
选项可以接受的值。
引入动作 count
计数某一个可选参数出现了几次。
parser.add_argument("-v", "--verbosity", action="count",
help="increase output verbosity")
我们刚刚引入了又一个新的关键字 default
。我们把它设置为 0
来让它可以与其他整数值相互比较。记住,默认情况下如果一个可选参数没有被指定,它的值会是 None
,并且它不能和整数值相比较(所以产生了 TypeError
异常)。
parser.add_argument("-v", "--verbosity", action="count", default=0,
help="increase output verbosity")
矛盾的选项
到目前为止,我们一直在使用 argparse.ArgumentParser
实例的两个方法。 让我们再介绍第三个方法 add_mutually_exclusive_group()
。 它允许我们指定彼此相互冲突的选项。 让我们再更改程序的其余部分以便使用新功能更有意义:我们将引入 --quiet
选项,它将与 --verbose
正好相反:
import argparse
parser = argparse.ArgumentParser(description="calculate X to the power of Y")
group = parser.add_mutually_exclusive_group()
group.add_argument("-v", "--verbose", action="store_true")
group.add_argument("-q", "--quiet", action="store_true")
parser.add_argument("x", type=int, help="the base")
parser.add_argument("y", type=int, help="the exponent")
args = parser.parse_args()
answer = args.x**args.y
if args.quiet:
print(answer)
elif args.verbose:
print("{} to the power {} equals {}".format(args.x, args.y, answer))
else:
print("{}^{} == {}".format(args.x, args.y, answer))
输出
$ python3 prog.py 4 2
4^2 == 16
$ python3 prog.py 4 2 -q
16
$ python3 prog.py 4 2 -v
4 to the power 2 equals 16
$ python3 prog.py 4 2 -vq
usage: prog.py [-h] [-v | -q] x y
prog.py: error: argument -q/--quiet: not allowed with argument -v/--verbose
$ python3 prog.py --help
usage: prog.py [-h] [-v | -q] x y
calculate X to the power of Y
positional arguments:
x the base
y the exponent
optional arguments:
-h, --help show this help message and exit
-v, --verbose
-q, --quiet
请注意用法文本中有细微的差异。 注意 [-v | -q]
,它的意思是说我们可以使用 -v
或 -q
,但不能同时使用两者。
后记
除了这里显示的内容,argparse
模块还提供了更多功能。 它的文档相当详细和完整,包含大量示例。 完成这个教程之后,你应该能毫不困难地阅读该文档。