首页
学习
活动
专区
工具
TVP
发布
精选内容/技术社群/优惠产品,尽在小程序
立即前往

getopt

源代码: Lib / getopt.py

注意

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

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

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

getopt.getopt(args, options[, long_options])

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

Note

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

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

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

getopt.gnu_getopt(args, options[, long_options])

此功能的工作原理与getopt()默认情况下使用的GNU风格扫描模式不同。这意味着选项和非选项参数可能会混在一起。getopt()只要遇到非选项参数,该函数立即停止处理选项。

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

2.3版本的新功能。

exception getopt.GetoptError

当在参数列表中找到无法识别的选项或者需要参数的选项不存在时,会引发此问题。异常的参数是一个指示错误原因的字符串。对于长期选项,给一个不需要一个选项的参数也会导致这个异常被提出。属性msgopt给出错误信息和相关选项; 如果没有与异常相关的特定选项,opt则为空字符串。

在版本1.6中更改:GetoptError作为一个同义词引入error

exception getopt.error

别名GetoptError; 为了向后兼容。

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

代码语言:javascript
复制
>>> 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']

使用长选项名称同样简单:

代码语言:javascript
复制
>>> 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']

在脚本中,典型用法如下所示:

代码语言:javascript
复制
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 str(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模块,可以使用更少的代码和更多的信息帮助和错误消息来生成等效的命令行界面:

代码语言:javascript
复制
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 ..

Module argparse 可选的命令行选项和参数解析库。

扫码关注腾讯云开发者

领取腾讯云代金券