16.5. getopt — 命令行选项的 C 风格解析器 — Python 文档
16.5. 获取选择 — 用于命令行选项的 C 风格解析器
笔记
getopt 模块是命令行选项的解析器,其 API 旨在为 C getopt()
函数的用户所熟悉。 不熟悉 C getopt()
函数或希望编写更少代码并获得更好帮助和错误消息的用户应考虑改用 argparse 模块。
该模块帮助脚本解析 sys.argv
中的命令行参数。 它支持与 Unix getopt()
函数相同的约定(包括'-
' 和 '--
' 形式的参数的特殊含义)。 也可以通过可选的第三个参数使用类似于 GNU 软件支持的长选项。
该模块提供了两个函数和一个例外:
- 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'
),并将选项参数作为其第二个元素,如果选项没有参数,则为空字符串。 选项出现在列表中的顺序与它们被发现的顺序相同,因此允许多次出现。 多头和空头选项可能混合。
- getopt.gnu_getopt(args, shortopts, longopts=[])
该函数的工作方式与 getopt() 类似,不同之处在于默认使用 GNU 风格的扫描模式。 这意味着选项和非选项参数可以混合使用。 getopt() 函数在遇到非选项参数时立即停止处理选项。
如果选项字符串的第一个字符是
'+'
,或者如果设置了环境变量POSIXLY_CORRECT
,那么一旦遇到非选项参数,选项处理就会停止.
- 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']
在脚本中,典型的用法是这样的:
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 ..