16.5. getopt - 命令行选项的C样式解析器

源代码: Lib / getopt.py

注意

getopt模块是用于命令行选项的解析器,其API设计为C getopt()函数的用户熟悉。不熟悉C getopt()功能或想要编写较少代码并获得更好帮助和错误消息的用户应考虑使用argparse模块。

此模块帮助脚本解析sys.argv中的命令行参数。它支持与Unix getopt()函数相同的约定(包括“-”和“-- ')。类似于GNU软件支持的长选项也可以通过可选的第三个参数使用。

此模块提供两个功能和一个例外:

getopt.getopt(args, shortopts, longopts=[])

解析命令行选项和参数列表。args是要解析的参数列表,没有对正在运行的程序的引用引用。通常,这意味着sys.argv[1:]shortopts是脚本想要识别的选项字母的字符串,选项需要一个参数后跟一个冒号(':' getopt()使用)。

注意

与GNU getopt()不同,在非选项参数后,所有其他参数也被视为非选项。这与非GNU Unix系统的工作方式类似。

longopts(如果指定)必须是具有应支持的长选项的名称的字符串列表。前导的'--'字符不应包含在选项名称中。需要参数的长选项后面应该加上等号('=')。不支持可选参数。要仅接受长选项,shortopts应为空字符串。可以识别命令行上的长选项,只要它们提供的选项名称的前缀与所接受的选项完全匹配即可。例如,如果longopts['foo', 'frob'],则--fo会匹配--foo,但--f不会唯一匹配,所以会引发GetoptError

返回值由两个元素组成:第一个是(选项, 值)对的列表;第二个是在选项列表被剥离之后留下的程序参数的列表(这是args的尾部切片)。每个返回的选项和值对具有该选项作为其第一个元素,前缀为短选项的连字符(例如,'-x')或长选项的两个连字符(例如'--long-option'),选项参数作为其第二个元素,如果选项没有参数,则为空字符串。选项在列表中以与查找它们相同的顺序出现,因此允许多次出现。长短选项可能会混合。

getopt.gnu_getopt(args, shortopts, longopts=[])

此函数的工作原理类似于getopt(),除了默认情况下使用GNU样式扫描模式。这意味着选项和非选项参数可以混合。只要遇到非选项参数,getopt()函数就会停止处理选项。

如果选项字符串的第一个字符为'+',或者如果设置了环境变量 POSIXLY_CORRECT,则选项处理将立即停止遇到非选项参数。

exception getopt.GetoptError

当在参数列表中找到一个无法识别的选项时,或者当一个需要参数的选项没有被赋予时,就会出现这种情况。异常的参数是指示错误原因的字符串。对于长选项,给予不需要的选项的参数也将引起此异常。属性msgopt给出错误消息和相关选项;如果没有与异常相关的特定选项,则opt是一个空字符串。

exception getopt.error

GetoptError的别名以实现向后兼容。

仅使用Unix样式选项的示例:

>>> import getopt
>>> args = '-a -b -cfoo -d bar a1 a2'.split()
>>> args
['-a', '-b', '-cfoo', '-d', 'bar', 'a1', 'a2']
>>> optlist, args = getopt.getopt(args, 'abc:d:')
>>> optlist
[('-a', ''), ('-b', ''), ('-c', 'foo'), ('-d', 'bar')]
>>> args
['a1', 'a2']

使用长选项名称同样很容易:

>>> s = '--condition=foo --testing --output-file abc.def -x a1 a2'
>>> args = s.split()
>>> args
['--condition=foo', '--testing', '--output-file', 'abc.def', '-x', 'a1', 'a2']
>>> optlist, args = getopt.getopt(args, 'x', [
...     'condition=', 'output-file=', 'testing'])
>>> optlist
[('--condition', 'foo'), ('--testing', ''), ('--output-file', 'abc.def'), ('-x', '')]
>>> args
['a1', 'a2']

在脚本中,典型的用法是这样的:

import getopt, sys

def main():
    try:
        opts, args = getopt.getopt(sys.argv[1:], "ho:v", ["help", "output="])
    except getopt.GetoptError as err:
        # print help information and exit:
        print(err)  # will print something like "option -a not recognized"
        usage()
        sys.exit(2)
    output = None
    verbose = False
    for o, a in opts:
        if o == "-v":
            verbose = True
        elif o in ("-h", "--help"):
            usage()
            sys.exit()
        elif o in ("-o", "--output"):
            output = a
        else:
            assert False, "unhandled option"
    # ...

if __name__ == "__main__":
    main()

注意,通过使用argparse模块,可以生成更少代码和更多信息帮助和错误消息的等效命令行界面:

import argparse

if __name__ == '__main__':
    parser = argparse.ArgumentParser()
    parser.add_argument('-o', '--output')
    parser.add_argument('-v', dest='verbose', action='store_true')
    args = parser.parse_args()
    # ... do something with args.output ...
    # ... do something with args.verbose ..

也可以看看

模块argparse
备用命令行选项和参数解析库。