2017-03-07 17 views
0

我想使用getopt分析命令行参数。它会成功解析一个参数。当我尝试传递多个参数时,它将采用第一个标志并将其他所有参数保留在参数中。另外,当我无法在参数列表中传递带冒号的参数时,异常不会触发。python getopt没有按预期处理标志

我:

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呼叫年代后得到了一个冒号。这不,不是我得到

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

在这两个例子中,有一个在选择一个空字符串,我不知道它的来源。这是问题吗?它来自哪里?我猜这是我错过的一些小事。 I

回答

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 

不工作这么好,如果选项的参数可与-开始,但它不能大多数情况下。

+0

虽然我并不打算成为必需的选项。我一直遵循的示例(如http://www.diveintopython.net/scripts_and_streams/command_line_arguments.html)表明,在不需要的选项后,您不需要冒号。此外,当没有-s选项通过时,这并不解决异常不会触发的问题,任何想法发生了什么? – Ben

+0

您在哪里阅读过'getopt'中需要的选项?带有':'的选项需要一个参数,如果选项缺失参数_and_是命令行中的最后一个参数,则该参数只能失败。如果你想要/可选,我建议你切换到optparser。 –

+0

需要参数的选项肯定是必需的参数吗?或者我读错了吗? – Ben