Python 命令解析类库optparse

[1]optparse是一个python库,可以帮助我们去解析终端中输入的命令,这样就可以让自己的python程序有类似于命令行软件的效果了。


如何使用

首先从这个库中import OptionParser这个类,在程序的一开始就生成一个对象。

1
2
3
from optparse import OptionParser
...
parser = OptionParser()

接下来就可以用parser.add_option方法定义命令的选项了

1
2
# 添加选项
parser.add_option(opt_str, ..., attr=value, ...)

对每个选项,至少用一个字符串命名,可以有很多个名字,如parser.add_option("-f", "--file", ...),一般我们会用一个短字符串和一个长字符串命名。

针对每一个选项,parser.add_option()方法的参数有:(注意,并不意味着它们可以全部一起出现)

  • action 当选项出现后optparse的行为
  • type 选项后面跟着的输入值的数据类型
  • dest 存储数据的目的地——options的成员变量
  • default 赋值给dest参数对应变量的初始化值
  • append 把选项后跟着的参数增加到dest中
  • nargs 有多少个数据类型参数type,
  • const 当action是存储一个常数时,该常数的值
  • help 当用户调用-h选项时,该选项对应的帮助文字
  • metavar 元变量,用于在help文档中表示选项后面跟着的参数

定义好命令的所有选项后,再调用对象的parse_args方法解析输入的命令行即可。

1
2
3
# 解析命令行
# 返回值options是一个对象,包含了定义过的所有选项的值,供我们调用
(options, args) = parser.parse_args()

add_option()的参数action

这个参数表示当命令行输入了某个选项后,optparse会做什么事情,绝大部分action都是存储行为:把值存到变量里。下面列列举几个常用的参数action的值。

1.action="store"

在命令行中该选项后边必须跟着一个参数,把这个参数转换为指定的数据类型,存储到dest对应的变量中。当action缺省时,默认值是store

1
2
3
4
# 例如,把命令行中-f后面的值以string类型存储到filename中
parser.add_option("-f", "--file",
                  action="store", type="string", dest="filename")
(options, args) = parser.parse_args()

命令解析后,我们在程序中便可以用options.filename来调用此字符串变量。(type除了字符串还可以是其他的数据类型。当type缺省时,默认值为string。)

2.action="store_const"

选项后无参数。存储一个常数到dest参数对应的变量中,这个常数由const参数指定。

1
2
3
# 当-q出现在命令行中,则options.verbose==0
parser.add_option("-q", "--quiet",
                  action="store_const", const=0, dest="verbose")

3.action="store_true" / "store_false"

选项后无参数。该行为存储布尔型变量到dest参数对应的变量中,一般作为flag标志。

1
2
# 当--clear出现在命令行中,则options.verbose为true
parser.add_option("--clear", action="store_true", dest="verbose")

4.action="append"

选项后跟着1个或多个参数(参数的个数由nargs指定,选项后参数的个数要和nargs完全一致)。该行为会把参数增加到dest参数对应的变量中。

1
2
3
4
# 当-t3出现在命令行中,则会执行:
# option.aaa = []
# option.aaa.append(int("3"))
parser.add_option("-t", "--tracks", action="append", type="int", dest="aaa")

5.action="count"

选项后无参数。该行为使dest参数对应的变量++,若dest参数对应的变量没有被default参数初始化,则默认为0。

1
2
3
4
# 当-v出现在命令行中,则会执行:
# option.verbosity = 0
# option.verbosity += 1
parser.add_option("-v", action="count", dest="verbosity")

帮助文档

optparse能自动生成帮助和使用说明文档,我们只需要给help参数赋值完成就好了。例如:

 1
 2
 3
 4
 5
 6
 7
 8
 9
10
11
12
13
14
15
usage = "usage: %prog [options] arg1 arg2"
# usage这行可以缺省,默认值为"usage: %prog [options]"
parser = OptionParser(usage=usage)
parser.add_option("-v", "--verbose",
                  action="store_true", dest="verbose", default=True,
                  help="make lots of noise [default]")
parser.add_option("-q", "--quiet",
                  action="store_false", dest="verbose",
                  help="be vewwy quiet (I'm hunting wabbits)")
parser.add_option("-f", "--filename",
                  metavar="FILE", help="write output to FILE")
parser.add_option("-m", "--mode",
                  default="intermediate",
                  help="interaction mode: novice, intermediate, "
                       "or expert [default: %default]")

当我们在命令行输入<yourscript> -h(或--help)后,便会出现

Usage: <yourscript> [options] arg1 arg2

Options:
  -h, --help            show this help message and exit
  -v, --verbose         make lots of noise [default]
  -q, --quiet           be vewwy quiet (I'm hunting wabbits)
  -f FILE, --filename=FILE
                        write output to FILE
  -m MODE, --mode=MODE  interaction mode: novice, intermediate, or
                        expert [default: intermediate]

其中,

  • usage参数为-h之后显示的第一行文字;
  • %prog返回当前程序的文件名;
  • %default返回当前选项的dest对应变量的默认值;
  • 而提供给选项的参数称为元变量,在add_option()方法中用参数metavar表示,若缺省,则默认值为dest参数对应的变量名的大写形式。

错误处理

提前判断可能出错的情况后,我们可以通过optparse的parser.error("")方法向用户输出错误信息。例如,在options.aoptions.b不能同时为真的情况下,若同时为真,则输出错误信息。

1
2
if options.a and options.b:
    parser.error("options -a and -b are mutually exclusive")

这将在终端输出程序的正确用法usage以及错误信息。

# 这里的-n选项的参数应该为整型类型
$ /usr/bin/foo -n 4x
Usage: foo [options]

foo: error: option -n: invalid integer value: '4x'

  1. https://docs.python.org/3.6/library/optparse.html?highlight=optparse#reference-guide

updatedupdated2020-12-302020-12-30
加载评论