本文翻译自Python官方documentation, Python 版本 3.3
原文链接:http://docs.python.org/3/howto/argparse.html#id1
----------------------------------------------------------------------------------------
这份教程是对 argparse 的简要介绍,argparse 是 Python 标准库中推荐使用的命令行解析模块.
注意:与 argparse 完成相同任务的模块还有 getopt(与 C语言中的 getopt() 函数用法相同)和已经被废弃的 optparse.另外 argparse 是以 optparse 为基础的,因此二者在用法方面很相似.
概念
让我们通过使用 ls 命令来展示在入门指引中我们将要探讨的命令行解析功能:
$ 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. ...
我们从这四条命令中可以看出几点概念:
1. ls 命令在不加选项时可以直接运行,它默认打印出当前目录下的内容.
2. 如果想实现默认以外的功能,就要多给 ls 一个参数.在第二条命令中,我们想让它打印出 pypy 目录下的内容,这时就要指明"位置参数".程序对命令行参数的处理取决于参数在命令行上出现的位置.这个概念在 cp 命令的使用中体现得更明显,cp 的基本用法是 cp SRC DEST.第一个参数是你要复制的东西,第二个参数是要复制到的目标位置.
3. 如果我们想要改变程序的行为.在第三条命令中,我们让 ls 打印出每个文件的详细信息,而不仅是文件名.这时的 -l 就是"可选参数".
4. 第四条命令是让显示一段帮助信息.在你从来没有用过一个命令的时候,这是非常有用的,我们简单地通过查看帮助文字就可以明白一个命令是怎样工作的.
基础
让我们从一个非常简单的例子开始,下面这段代码几乎什么都不做:
import argparse parser = argparse.ArgumentParser() parser.parse_args()
程序的运行结果如下:
$ 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
解释一下每次程序都做了什么:
1. 不加任何选项就运行,结果什么都没有打印到标准输出.这没啥意思.
2. 第二条命令已经开始体现出 argparse 模块的优势了:即使我们什么都没做,argparse 也能自动显示出漂亮的帮助信息.
3. --help 选项(或缩写 -h),是唯一被自动添加的选项.在命令中给出任何其他的选项都会导致错误.
位置参数介绍
一个例子:
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
解释一下程序做了什么:
1. add_argument()方法用来添加我们想要的选项.在例子中,我们添加了一个叫 echo 的选项.
2. 现在运行程序必须指定一个参数
3. parse_args() 方法返回一些参数中指明的数据,比如例子中的 echo.
4. args.echo 是一个"有魔力"的变量,即我们不需要指定在 echo 参数位置上的值用什么变量来存储,argparse 自动创建一个和参数名相同名字的变量,作为 parse_args()返回值的方法.
注意到,虽然帮助信息看起来漂亮齐全,但其实它并不够有用.我们通过帮助可以知道有一个叫 echo 的位置参数,但不能从帮助信息中得知它的作用.下面做一点小的改动:
import argparse parser = argparse.ArgumentParser() parser.add_argument("echo", help="echo the string you use here") args = parser.parse_args() print(args.echo)
$ python3 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
(未完待续)…………