前言
Argparse是Python标准库推荐的命令行解析模块。还有另外两个模块也实现了相同的功能,它们是getopt,optparse。
概念
ls
cpython devguide prog.py pypy rm-unused-function.patch
$ ls pypy
ctypes_configure demo dotviewer include lib_pypy lib-python ...
$ ls -l
total 20
drwxr-xr-x 19 wena wena 4096 Feb 18 18:51 cpython
drwxr-xr-x 4 wena wena 4096 Feb 8 12:04 devguide
-rwxr-xr-x 1 wena wena 535 Feb 19 00:05 prog.py
drwxr-xr-x 14 wena wena 4096 Feb 7 00:59 pypy
-rw-r--r-- 1 wena wena 741 Feb 18 01:01 rm-unused-function.patch
$ ls --help
Usage: ls [OPTION]... [FILE]...
List information about the FILEs (the current directory by default).
Sort entries alphabetically if none of -cftuvSUX nor --sort is specified.
...
从 ls的四条命令里我们可以学到一些概念:
- 当不带任何选项运行ls命令的时候,ls也可以非常好的工作并发挥它的作用---展示出了当前目录下的内容。
- 如果我们想要其为我们提供更多功能,我们可以在其后附加参数,这种类型的参数称为定位参数(positional argument),因为程序需要通过它的内容和它在命令行中出现的位置来确定实现的功能。
- -l 被称为可选参数(optional argument)。
基础
让我们从一个简单的例子开始~
import argparse
parser = argparse.ArgumentParser()
parser.parse_args()</span>
代码执行后的结果如下:
$ 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</span>
- 第一条没有附带任何选项执行了脚本,没有输出任何结果,没有什么用处。
- 第二条开始展示出了argparse模块的作用,我们什么都没有做,但还是获得了漂亮的帮助信息。
- --help选项,或简称为-h是唯一我们可用的选项,使用任何其他选项都会导致错误。
定位参数介绍
例子:
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()方法,该方法用来指定程序会接受什么样的命令行选项。我们命名一个名为echo的参数,见名知意。
- 运行我们的程序现在需要我们来指定一个选项了。
- 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
现在当我们输入-h选项时,会显示出echo的用处。 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
可选择参数介绍
如何添加可选择参数?
import argparse
parser = argparse.ArgumentParser()
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
- 可选择参数的作用是当其被指定时会显示一些其他的东西。
- 当运行时没有指定可选择参数,程序也不会出错。如果一个可选择的参数没有被使用,那么与其相关的变量,如args.verbosity会被赋予None,再if判断中位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$ 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
- 选项参数现在就更像是一个标志位,我们甚至可以改变它的名字来匹配它的用处
- 当你指定一个值的时候会报错
- 注意help信息的不同
参考文献:https://docs.python.org/2/howto/argparse.html#id1