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 是脚本想要识别的选项字母字符串,需要参数的选项后跟一个冒号(':'
),接受可选参数的选项后跟两个冒号('::'
);即与 Unixgetopt()
使用的格式相同。备注
与 GNU
getopt()
不同,在一个非选项参数之后,所有后续的参数也都被视为非选项参数。这类似于非 GNU 的 Unix 系统的工作方式。如果指定了 longopts,它必须是一个字符串列表,其中包含应支持的长选项的名称。选项名称中不应包含前导的
'--'
字符。需要参数的长选项后面应跟一个等号('='
)。接受可选参数的长选项后面应跟一个等号和一个问号('=?'
)。要只接受长选项,shortopts 应为空字符串。只要命令行上的长选项提供了与某个可接受选项完全匹配的前缀,就可以被识别。例如,如果 longopts 是['foo', 'frob']
,那么选项--fo
将匹配为--foo
,但--f
不会唯一匹配,因此会引发GetoptError
。返回值包含两个元素:第一个是
(option, value)
对的列表;第二个是在选项列表被剥离后剩余的程序参数列表(这是 args 的一个尾部切片)。每个返回的选项和值对中,第一个元素是选项,对于短选项,它带有连字符前缀(例如'-x'
),对于长选项,它带有两个连字符前缀(例如'--long-option'
),第二个元素是选项的参数,如果选项没有参数,则为空字符串。列表中的选项出现的顺序与它们被找到的顺序相同,因此允许多次出现。长选项和短选项可以混合使用。在 3.14 版本发生变更: 支持可选参数。
- getopt.gnu_getopt(args, shortopts, longopts=[])¶
此函数的工作方式类似于
getopt()
,但默认使用 GNU 风格的扫描模式。这意味着选项和非选项参数可以混合使用。getopt()
函数一旦遇到非选项参数,就会停止处理选项。如果选项字符串的第一个字符是
'+'
,或者如果环境变量POSIXLY_CORRECT
被设置,那么选项处理会在遇到非选项参数时立即停止。如果选项字符串的第一个字符是
'-'
,那么后面跟着选项的非选项参数会被添加到一个选项-值对的列表中,该对的第一个元素是None
,第二个元素是非选项参数的列表。gnu_getopt()
结果的第二个元素是在最后一个选项之后的程序参数列表。在 3.14 版本发生变更: 支持按顺序返回混合的选项和非选项参数。
- exception getopt.GetoptError¶
当在参数列表中发现无法识别的选项时,或者当需要参数的选项没有得到参数时,会引发此异常。此异常的参数是一个字符串,指明了错误的原因。对于长选项,给一个不需要参数的选项提供了参数也会引发此异常。属性
msg
和opt
提供了错误消息和相关的选项;如果没有与异常相关的特定选项,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']
可选参数应被显式地指定
>>> s = '-Con -C --color=off --color a1 a2'
>>> args = s.split()
>>> args
['-Con', '-C', '--color=off', '--color', 'a1', 'a2']
>>> optlist, args = getopt.getopt(args, 'C::', ['color=?'])
>>> optlist
[('-C', 'on'), ('-C', ''), ('--color', 'off'), ('--color', '')]
>>> args
['a1', 'a2']
可以保留选项和非选项参数的顺序
>>> s = 'a1 -x a2 a3 a4 --long a5 a6'
>>> args = s.split()
>>> args
['a1', '-x', 'a2', 'a3', 'a4', '--long', 'a5', 'a6']
>>> optlist, args = getopt.gnu_getopt(args, '-x:', ['long='])
>>> optlist
[(None, ['a1']), ('-x', 'a2'), (None, ['a3', 'a4']), ('--long', 'a5')]
>>> args
['a6']
在脚本中,典型的用法是这样的
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
)版本的不同之处。