一、简介:
最近在写程序的时候,需要用到命令行解析工具。调研了几个工具之后,发现argparse 是 Python 中最好用的,它还是Python标准库中推荐使用的编写命令行程序的工具。在官网文档中找到了一篇 toturial ,简单记录一下学习过程。
二、基本认识
我们从一个最简单的例子开始:
import argparse
parser = argparse.ArgumentParser()
parser.add_argument()
parser.parse_args()
首先,我们需要导入该模块,然后创建一个解析对象。之后向该对象中添加你要关注的命令行参数和选项,每一个 add_argument 方法对应一个你要关注的参数或选项;最后调用 parse_args() 方法进行解析;解析成功之后即可使用。
我们运行一下上面的程序(注意:把第三行注释掉),可以得到以下结果:
$ python prog.py
$ python prog.py --help
usage: prog.py [-h]
optional arguments:
-h, --help show this help message and exit
$ python prog.py --verbose
usage: prog.py [-h]
prog.py: error: unrecognized arguments: --verbose
$ python prog.py foo
usage: prog.py [-h]
prog.py: error: unrecognized arguments: foo
结果分析:
- 若不给参数而运行程序,那么将不会得到任何结果。
- 第二条命令显示了使用 argparse 的好处,你什么也没做,却得到了一个很好的帮助信息。
- 我们不需要自己手动设置 --help 参数,就能得到一个良好的帮助信息。但是,如果我们输入其他参数(比如 foo)就会产生一个错误。
三、位置参数
首先,我们给出一个例子:
import argparse
parser = argparse.ArgumentParser()
parser.add_argument("echo")
args = parser.parse_args()
print args.echo
运行结果:
$ python prog.py
usage: prog.py [-h] echo
prog.py: error: the following arguments are required: echo
$ python prog.py --help
usage: prog.py [-h] echo
positional arguments:
echo
optional arguments:
-h, --help show this help message and exit
$ python prog.py foo
foo
结果分析:
- 我们增加了一个 add_argument() 方法,用来设置程序可接受的命令行参数。
- 现在如果我们要运行这个程序,就必须设置一个参数。
- parse_args() 方法实际上从我们的命令行参数中返回了一些数据,在上面的例子中就是 echo。
- 这个神奇的过程,就是 argparse 自动完成的。
尽管自动产生的帮助信息展示地很美观,但是我们仍然无法只根据 echo 这个参数知道它是做什么的。所以,我们增加了一些东西,使得它变得更有用。
import argparse
parser = argparse.ArgumentParser()
parser.add_argument("echo", help = "echo the string you use here")
args = parser.parse_args()
print args.echo
运行结果:
$ python prog.py -h
usage: prog.py [-h] echo
positional arguments:
echo echo the string you use here
optional arguments:
-h, --help show this help message and exit
在此基础上,我们再多改变一点:(计算输入参数 square 的平方)
import argparse
parser = argparse.ArgumentParser()
parser.add_argument("square", help="display a square of a given number")
args = parser.parse_args()
print args.square**2
然后运行这个程序,我们得到如下结果:
$ python prog.py 4
Traceback (most recent call last):
File "prog.py", line 5, in
print args.square**2
TypeError: unsupported operand type(s) for ** or pow(): 'str' and 'int'
这个程序并不能正确运行,因为 argparse 会将输入当作字符串处理,所以我们需要设置它的类型(type = 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
然后,我们再来运行这个程序,得到如下结果:
$ python prog.py 4
16
$ python prog.py four
usage: prog.py [-h] square
prog.py: error: argument square: invalid int value: 'four'
至此,我们已经学会了编写一个基础的命令行参数。
四、可选参数
第三节中,我们已经学会了位置参数。接下来,让我们来学习一下可选参数,如下:
import argparse
parser = argparse.ArgmentParser()
parser.add_argument("--verbosity", help = "increase output verbosity")
args = parser.parse_args()
if args.verbosity:
print "verbosity turned on"
运行上面这个程序,我们会得到如下结果:
$ python prog.py --verbosity 1
verbosity turned on
$ python prog.py
$ python prog.py --help
usage: prog.py [-h] [--verbosity VERBOSITY]
optional arguments:
-h, --help show this help message and exit
--verbosity VERBOSITY
increase output verbosity
$ python prog.py --verbosity
usage: prog.py [-h] [--verbosity VERBOSITY]
prog.py: error: argument --verbosity: expected one argument
结果分析:
- 当
--verbosity
被修改时,这个程序就会输出一些东西,如果没有修改,那么不输出任何东西。 - 从上面的结果我们发现,可选参数果然是可选的。因为我们不输入任何参数的时候,发现程序没有报错。因为在默认情况下,
args.verbosity
输出的是None
,只有在给定参数的情况下,才会输出值。 -
help
信息也有一点改变。 - 当我们使用
--version
选项,那么就一定要指定修改的值。
在上面这个例子中,我们可以指定任何的值给 --verbosity
,但是在我们的程序中,我们只需要知道 True
或者 False
。OK,那就让我们来修改一下程序吧,如下:
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"
运行程序,输出结果如下:
$ python prog.py --verbose
verbosity turned on
$ python prog.py --verbose 1
usage: prog.py [-h] [--verbose]
prog.py: error: unrecognized arguments: 1
$ python 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
。也就是说如果这个选项--verbose
被修改了,那么我们就给它赋值为True
,如果没有被修改,那么就是False
。 - 当你修改这个值的时候,实际上,不管你指定的是什么,它都会被赋值为
True
。
五、短参数
如果你熟悉命令行的使用,你会注意到我还没有谈到短参数的主题。 但是,这个很简单:
import argparse
parser = argparse.ArgumentParser()
parser.add_argument("-v", "--verbose", help="increase output verbosity",
action="store_true")
args = parser.parse_args()
if args.verbose:
print "verbosity turned on"
运行结果如下:
$ python prog.py -v
verbosity turned on
$ python prog.py --help
usage: prog.py [-h] [-v]
optional arguments:
-h, --help show this help message and exit
-v, --verbose increase output verbosity
请注意,新功能也在 help
中进行了展示。
六、位置参数和可选参数联合使用
我们将位置参数和可选参数进行联合使用,构造出如下代码:
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
运行程序,输出结果为:
$ python prog.py
usage: prog.py [-h] [-v] square
prog.py: error: the following arguments are required: square
$ python prog.py 4
16
$ python prog.py 4 --verbose
the square of 4 equals 16
$ python prog.py --verbose 4
the square of 4 equals 16
结果分析:
- 因为我们引入了一个位置参数,所以在命令行中我们必须导入这个参数,不然就会报错。
- 位置参数和可选参数的前后位置是无关的。
那如果说,我们要在最开始就给变量进行一个赋值,那么该如何操作呢?别急,请看下面代码:
import argparse
parser = argparse.ArgumentParser()
parser.add_argument("--square", type = int, default = 10, help = "display a square of a given number")
args = parser.parse_args()
print args.square * args.square
我们运行以上程序,得到如下结果:
$ python prog.py
100
$ python prog.py --square 12
144
结果分析:
我们添加了 default
属性,并且将它设置为 10 。也就是说,如果我们不去修改这个参数,那么程序就会按照 square = 10,来进行运行。如果我们修改这个值,那么就会按照修改的值进行运行。
Reference
Python 命令行解析工具 Argparse介绍(一)
Python 官网教程