我正在尝试使用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中都有一个空字符串,我不知道它来自哪里。那是问题吗?它来自哪里?我猜这是我错过的小事。 我
答案 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>