getopt —用于命令行选项的 C 样式解析器

源代码: Lib/getopt.py

Note

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


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

该模块提供两个Function和一个 exception:

  • getopt. getopt(* args shortopts longopts = [] *)
    • 解析命令行选项和参数列表。 * args *是要解析的参数列表,没有对正在运行的程序的前导引用。通常,这表示sys.argv[1:]。 * shortopts *是脚本要识别的选项字母的字符串,其中的选项需要一个参数,后跟一个冒号(':';即,Unix getopt()使用的格式)。

Note

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

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

返回值包含两个元素:第一个是(option, value)对的列表;第二个是剥离选项列表后剩下的程序参数列表(这是* args *的结尾部分)。返回的每个选项和值对都将选项作为其第一个元素,对于短选项(例如'-x')或连字符(对于长选项(例如'--long-option'),两个连字符)作为前缀,并将选项参数作为其第二个元素,或如果选项没有参数,则为空字符串。这些选项在列表中的出现 Sequences 与找到它们的 Sequences 相同,因此允许多次出现。多头和空头期权可能混合在一起。

  • getopt. gnu_getopt(* args shortopts longopts = [] *)
    • 此Function的作用类似于getopt(),除了默认情况下使用 GNU 样式扫描模式。这意味着选项和非选项参数可以混合使用。一旦遇到非选项参数,getopt()函数就会停止处理选项。

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

  • exception getopt. GetoptError

    • 当在参数列表中找到无法识别的选项或不给需要参数的选项时,将引发此问题。异常的参数是指示错误原因的字符串。对于长期权,给予不需要期权的期权的自变量也会导致引发此异常。属性msgopt给出错误消息和相关选项;如果没有与异常相关的特定选项,则opt是空字符串。
  • exception getopt. error

仅使用 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 ..

See also

  • Module argparse

  • 备用命令行选项和参数解析库。