python getopt没有按预期处理标志

时间:2017-03-07 21:44:37

标签: python

我正在尝试使用getopt解析命令行参数。它将成功解析单个参数。当我尝试传递多个参数时,它会获取第一个标志并将其他所有内容留在args中。此外,当我在参数列表中传递带有冒号的参数失败时,异常不会触发。

我有:

def main(argv):
    try:
        opts, args = getopt.getopt(argv,"ns:i:",["num_ratios", "sample=", "iteration="])
    except getopt.GetoptError:
        print ('test.py -s <sampleName -i <iteration>')
        sys.exit(2)
    print (opts)
    print (args)
    for opt, arg in opts:
        if opt == '-n':
            n = arg
        elif opt == '-s':
            sampleName=arg
        elif opt == '-i':
            iteration = arg

if __name__ == "__main__":
    main(sys.argv[1:])

如果我执行:

python calculateRatios.py -n 1 -s wibble

我得到了

[('-n', '')]
['1', '-s', 'wibble']

它告诉我它正在选择-n作为一个选项,但没有将值1与它相关联,那么它就会停止。它没有找到更多的标志,因此没有分配值。

然后我执行:

python calculateRatios.py -n 1 

我的理解是异常应该开始,因为我在getopt.getopt调用中的s之后有一个冒号。它没有,而是我

[('-n', '')]
['1']

在这两个示例中,opt中都有一个空字符串,我不知道它来自哪里。那是问题吗?它来自哪里?我猜这是我错过的小事。 我

1 个答案:

答案 0 :(得分:0)

这是预料之中的。您必须将冒号或参数与n选项无关,而n选项只是一个开关。之后,Arg解析被去同步,并且由于getopt没有遇到另一个选项,因此它假定传递了一些其他非选项参数。

修复它。

"n:s:i:",["num_ratios=", "sample=", "iteration="]

请注意,获取异常的唯一方法是在命令行末尾传递不带参数的参数必需参数,否则将消耗其他开关/参数。

我做了什么来阻止用户省略参数和去同步参数解析 - 这在大多数情况下是适用的 - 是测试arg不是以-开头(大多数参数)不要像-)这样开始:

for opt, arg in opts:
    if arg.startswith("-"):
        raise Exception("Argument omitted for {}".format(opt))
    if opt == '-n':
        n = arg
    elif opt == '-s':
        sampleName=arg
    elif opt == '-i':
        iteration = arg

如果选项参数可以从-开始,那么效果不会很好,但在大多数情况下它不能。{/ p>