为什么不在getthon上运行python 2.7.5 mac os x

时间:2014-01-14 01:11:45

标签: python macos python-2.7

由于某种原因,当我使用长格式传递一个选项时,getopt函数无法正确识别它。有任何想法吗?我在这里阅读了文档http://docs.python.org/2/library/getopt.html,它似乎不应该做它正在做的事情。

我在mac os x上运行python 2.7.5作为记录。

[user@macbookpro:~] python Script.py test --condition=foo --output-file abc.def
['test', '--condition=foo', '--output-file', 'abc.def']
[]
<type 'list'>

def main(argv):

    try:
        optlist, args = getopt.getopt(argv[1:], '', ['condition=', 'output-file=', 'testing'])
    except getopt.GetoptError, msg:
        logging.warning(msg)
        return 1

    print args
    print optlist
    print type(optlist)

我应该按照文档中的说明获得以下内容:

  
    
      

optlist       [(' - condition','foo'),(' - testing',''),(' - output-file','abc.def')]

    
  

1 个答案:

答案 0 :(得分:1)

文档没有说你应该得到它。事实上,它明确表示你不应该:

  

注意:与GNU getopt()不同,在非选项参数之后,所有其他参数也被视为非选项。这类似于非GNU Unix系统的工作方式。

如果查看这些示例,非选项参数在命令行上的选项之后。如果你这样做,它会给你你想要的东西:

$ python Script.py --condition=foo --output-file abc.def test
['test']
[('--condition', 'foo'), ('--output-file', 'abc.def')]
<type 'list'>

但是,如果您执行与示例不同的操作,则会从示例中获得不同的结果。你得到的结果与文档所说的相符。

但实际上,如果您不理解为什么在选项之后放test与将选项放在选项之前不同,那么您首先不应该使用getopt。正如the docs在顶部的一个大盒子里说的那样:

  

注意: getopt模块是命令行选项的解析器,其API旨在让C getopt()函数的用户熟悉。不熟悉C getopt()函数或想要编写更少代码并获得更好帮助和错误消息的用户应考虑使用argparse模块。

如果您真的想学习getopt,请阅读the POSIX definition。这就是Python试图模仿的东西。它确实添加了GNU-style --个长参数,但这并不意味着它包含所有GNU扩展。