反正有没有说服python的getopt来处理选项的可选参数?

时间:2009-10-07 16:30:59

标签: python getopt getopt-long

根据python getopt的文档(我认为),选项字段应该表现为getopt()函数。但是我似乎无法为我的代码启用可选参数:

#!/usr/bin/python
import sys,getopt

if __name__ == "__main__":
    try:
        opts, args = getopt.gnu_getopt(sys.argv[1:], "v::", ["verbose="])
    except getopt.GetoptError, err:
        print str(err)
        sys.exit(1)

    for o,a in opts:
        if o in ("-v", "--verbose"):
            if a:
                verbose=int(a)
            else:
                verbose=1
            print "verbosity is %d" % (verbose)

结果:

$ ./testopt.py -v
option -v requires argument
$ ./testopt.py -v 1
verbosity is 1

5 个答案:

答案 0 :(得分:9)

getopt不支持可选参数。如果选项很长,你可以这样做:

$ ./testopt.py --verbose=

将导致空字符串值。

您可以找到argparse模块更灵活。

答案 1 :(得分:5)

不幸的是,没有办法。来自optparse docs

  

通常,给定选项要么带参数,要么不带参数。很多人都想要一个“可选的选项参数”功能,这意味着如果他们看到某些选项将采用参数,如果他们不这样做则不会。这有点争议,因为它使解析变得模糊:如果“-a”采用可选参数而“-b”完全是另一种选择,我们如何解释“-ab”?由于这种歧义,optparse不支持此功能。

编辑: oops,即optparse模块而不是getopt模块,但两个模块都没有“可选选项参数”的原因对两者都是相同的。

答案 2 :(得分:2)

您可以使用getopt执行可选参数:

import getopt
import sys

longopts, shortopts = getopt.getopt(sys.argv[1:], shortopts='', longopts=['env='])
argDict = dict(longopts)

if argDict.has_key('--env') and argDict['--env'] == 'prod':
    print "production"
else:
    print "sandbox"

用法:

$ python scratch.py --env=prod
production

$ python scratch.py --env=dev
sandbox

$ python scratch.py
sandbox

答案 3 :(得分:0)

如果您使用的是2.3或更高版本,您可能需要尝试使用optparse模块,因为它“更方便,更灵活,功能更强大......”,以及更新版本。唉,正如Pynt回答的那样,似乎不可能得到你想要的东西。

答案 4 :(得分:0)

python的getopt应该真正支持可选的args,比如GNU getopt,要求' =' 在指定参数时使用。现在你可以很容易地模拟它, 通过隐式更改--option到--option =

来实现此约束

即。你可以指定--option需要一个参数, 然后调整--option到--option =如下:

for i, opt in enumerate(sys.argv):
    if opt == '--option':
        sys.argv[i] = '--option='
    elif opt == '--':
        break