这篇Python学习教程主要是对 argparse(Python标准库中推荐的命令行解析模块) 进行简要介绍。
note 还有两个其他模块也可以完成相同的任务,分别是 getopt(与C语言中的 getopt() 等效)和已经过时的 optparse。需要注意的是 argparse 也是基于 optparse,因此在用法上非常相似。
概念
让我们通过使用 ls 命令来展示我们将在本Python学习教程入门中探索的功能类型:
$ 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 命令在不接受任何参数时也是有作用的,它默认用于展示当前目录下的内容。
- 如果我们想它让提供非默认以外的功能,我们必须指定更多的参数。在这个例子中,我们想要展示一个不同的目录:pypy。我们所做的是指定所谓的位置参数。之所以这样命名,是因为程序仅根据命令行中的位置知道该值的用途。这个概念和
cp 之类的命令更相关,cp 命令最基本的用法是 cp SRC DEST。第一个位置是你要复制的内容,第二个位置是你要复制到的位置。 - 现在,假设我们要更改程序的行为。在我们的示例中,我们为每个文件显示更多偏偏,而不仅仅是显示文件名。在这种情况下,-l被称为可选参数。
- 这是帮助文本的的一小段。它非常有用,因为你可以通过它找到从未使用过的程序,并且只需要阅读帮助文本即可了解其工作方式。
基础用法
让我们从一个非常简单的例子开始,这个例子几乎什么事情都没做:
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
下面是这段代码做了什么的解释:
- 不带任何参数执行这个脚本没有任何的输出,没有什么作用。
- 第二个开始显示 argparse 模块的用处,我们几乎什么也没做,但是已经得到了很好的帮助信息
- –help 选项可以简写成 -h,它是唯一一个我们能指定的选项(即不需要代码定义),指定任何其他的都会导致报错。但即使这样,我们仍然已经免费获得了帮助信息。
位置参数介绍
一个例子:
import argparse
parser = argparse.ArgumentParser()
parser.add_argument("echo")
args = parser.parse_args()
print(args.echo)
运行这段代码:
import argparse
parser = argparse.ArgumentParser()
parser.add_argument("echo")
args = parser.parse_args()
print(args.echo)
代码解释:
- 我们增加了 add_argument() 方法,这个方法用于指定程序可以接受的命令行。在这个例子中,我将它命名为
echo,与它的功能相符合。 - 这时我们调用程序需要我们指定选项。
- parse_args() 方法实际上会从我们指定的选项中返回一些数据,在这个例子中为 echo。
- 最近的 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)
这时我们将得到:
$ 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
现在,让我们来做一些更有用的事情:
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)
上面代码执行的结果如下:
$ python3 prog.py 4
Traceback (most recent call last):
File "prog.py", line 5, in <module>
print(args.square**2)
TypeError: unsupported operand type(s) for ** or pow(): 'str' and 'int'
结果不是很好,这是因为 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'
结果很好,程序甚至可以在执行前因为错误输入而结束。
可选参数介绍
到目前为止,我们已经介绍过了位置参数。接下来让我们看下如何添加一个可选参数:
import argparse
parser = argparse.ArgumentParser()
parser.add_argument(