文章目录
简介
argparse
模块可以让人轻松编写用户友好的命令行接口。程序定义它需要的参数,然后argparse
将弄清如何从 sys.argv
解析出那些参数。 argparse
模块还会自动生成帮助和使用手册,并在用户给程序传入无效参数时报出错误信息。
argparse
是Python标准库中推荐的命令行解析模块,无需安装可以直接使用。argparse是基于被弃用的optparse,因此用法与其非常相似。
还有另外两个模块可以完成同样的任务,称为
getopt
(对应于 C 语言中的getopt()
函数) 和被弃用的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.
...
这四个命令中可以看到几个概念:
-
ls 是一个即使在运行的时候没有提供任何选项,也非常有用的命令。在默认情况下他会输出当前文件夹包含的文件和文件夹。
-
如果我们想要使用比它默认提供的更多功能,我们需要告诉该命令更多信息。在这个例子里,我们想要查看一个不同的目录,
pypy
。我们所做的是指定所谓的位置参数。之所以这样命名,是因为程序应该如何处理该参数值,完全取决于它在命令行出现的位置。更能体现这个概念的命令如 cp,它最基本的用法是cp SRC DEST
。第一个位置参数指的是你想要复制的,第二个位置参数指的是你想要复制到的位置。 -
现在假设我们想要改变这个程序的行为。在我们的例子中,我们不仅仅只是输出每个文件的文件名,还输出了更多信息。在这个例子中,
-l
被称为可选参数。 -
这是一段帮助文档的文字。它是非常有用的,因为当你遇到一个你从未使用过的程序时,你可以通过阅读它的帮助文档来弄清楚它是如何运行的。
基础
从一个简单的例子开始:
import argparse
parser = argparse.ArgumentParser()
parser.parse_args()
运行结果如下:
$ python3 prog.py
$ python3 prog.py --help
usage: prog.py [-h]
options:
-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)
运行结果:
$ 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
options:
-h, --help show this help message and exit
$ python3 prog.py foo
foo
-
add_argument()
方法用于指定程序能够接受哪些命令行选项。在这个例子中,我将选项命名为echo
,与其功能一致。 -
现在调用我们的程序必须要指定一个选项。
-
parse_args()
方法实际上从指定的选项返回一些数据,在本例中是echo
。 -
不需要指定哪个变量是存储哪个值的,名称与传递给方法的字符串参数一致,都是
echo
。
然而请注意,尽管显示的帮助看起来清楚完整,但它可以比现在更有帮助。比如我们可以知道 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
options:
-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)