0%

Argparse Tutorial

Argparse Tutorial

这篇教程简明地介绍了Python标准库推荐使用的命令行参数解析模块——Argparse的使用

注意 还有两个完成相同任务的其他模块,即getopt (与C语言相当的getopt() )和已弃用的optparse 。 还要注意, argparse基于optparse ,因此在使用方面非常相似。

概念

让我们来看看我们将在本入门教程中使用ls命令的功能:

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
$ 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
2
3
import argparse
parser = argparse.ArgumentParser()
parser.parse_args()

以下是运行代码的结果:

1
2
3
4
5
6
7
8
9
10
11
12
$ 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,可以得到帮助信息

介绍位置参数

例子:

1
2
3
4
5
import argparse
parser = argparse.ArgumentParser()
parser.add_argument("echo")
args = parser.parse_args()
print(args.echo)

运行结果:

1
2
3
4
5
6
7
8
9
10
11
12
13
$ 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

运行分析:

  • 我们添加了add_argument()方法,这个方法是我们用来指定程序接受的哪些命令行选项。 在这种情况下,我将其命名为echo,使其符合其功能。
  • 现在调用我们的程序要求我们指定一个参数。
    parse_args()方法实际上从指定的选项返回一些数据,在这种情况下为echo。
  • 该变量argparse自动执行的的(即不需要指定该值存储在哪里)。 您还会注意到它的名称与给定的方法echo的字符串参数匹配。

补充需要输入一个参数。然后脚本输出这个参数。

尽管自动产生的信息已经很友好,但是我们仍然不能知道参数的具体信息。

1
2
3
4
5
import argparse
parser = argparse.ArgumentParser()
parser.add_argument("echo", help="echo the string you use here")
args = parser.parse_args()
print(args.echo)

运行:

1
2
3
4
5
6
7
8
$ 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

现在,在做一些更有意义的事:

1
2
3
4
5
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)

运行结果:

1
2
3
4
5
$ 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把输入的参数视为整数:

1
2
3
4
5
6
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)

运行代码查看结果:

1
2
3
4
5
$ python3 prog.py 4
16
$ python3 prog.py four
usage: prog.py [-h] square
prog.py: error: argument square: invalid int value: 'four'

运行成功,而且可以检测非法输入。

介绍可选参数

2017年07月07日16:12:05
后面继续翻译
https://docs.python.org/3/howto/argparse.html#id1

中文https://blog.ixxoo.me/argparse.html