Python学习教程:Python argparse模块

这篇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被称为可选参数。
  • 这是帮助文本的的一小段。它非常有用,因为你可以通过它找到从未使用过的程序,并且只需要阅读帮助文本即可了解其工作方式。

Python学习教程:Python argparse模块
基础用法

让我们从一个非常简单的例子开始,这个例子几乎什么事情都没做:

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<
  • 1
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值