getopt — 命令行选项的 C 风格解析器

源代码: Lib/getopt.py

注意

此模块被认为是功能完整的。 optparse 模块中提供了此 API 的更具声明性和可扩展性的替代方案。命令行参数处理的进一步功能增强作为 PyPI 上的第三方模块提供,或者作为 argparse 模块的功能提供。


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

不熟悉 Unix getopt() 函数的用户应该考虑使用 argparse 模块。熟悉 Unix getopt() 函数,但希望在编写更少代码并获得更好的帮助和错误消息的同时获得等效行为的用户应该考虑使用 optparse 模块。有关更多详细信息,请参阅 选择参数解析库

此模块提供两个函数和一个异常

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

解析命令行选项和参数列表。 args 是要解析的参数列表,不包括对正在运行的程序的引导引用。通常,这意味着 sys.argv[1:]shortopts 是脚本要识别的选项字母的字符串,需要参数的选项后跟冒号 (':';即,与 Unix getopt() 使用的格式相同)。

注意

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

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

返回值包含两个元素:第一个是 (option, value) 对的列表;第二个是剥离选项列表后剩余的程序参数列表(这是 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"
    process(args, output=output, verbose=verbose)

if __name__ == "__main__":
    main()

请注意,通过使用 optparse 模块,可以使用更少的代码和更丰富的信息性帮助和错误消息来生成等效的命令行界面

import optparse

if __name__ == '__main__':
    parser = optparse.OptionParser()
    parser.add_option('-o', '--output')
    parser.add_option('-v', dest='verbose', action='store_true')
    opts, args = parser.parse_args()
    process(args, output=opts.output, verbose=opts.verbose)

在这种情况下,也可以使用 argparse 模块生成大致等效的命令行界面

import argparse

if __name__ == '__main__':
    parser = argparse.ArgumentParser()
    parser.add_argument('-o', '--output')
    parser.add_argument('-v', dest='verbose', action='store_true')
    parser.add_argument('rest', nargs='*')
    args = parser.parse_args()
    process(args.rest, output=args.output, verbose=args.verbose)

有关此代码的 argparse 版本与 optparse (和 getopt)版本在行为上的差异的详细信息,请参阅 选择参数解析库

另请参阅

模块 optparse

声明式命令行选项解析。

模块 argparse

更具主见的命令行选项和参数解析库。