根据有关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
有帮助吗?

解决方案

getopt 不支持可选参数。如果有长期选择,您可以做:

$ ./testopt.py --verbose=

这将导致空弦值。

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

其他提示

不幸的是,没有办法。来自 Optparse文档:

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

编辑: 糟糕,那就是optparse模块不是getopt模块,而是两个模块都没有“可选选项参数”的理由。

您可以使用像这样的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

如果您使用的是2.3版或更高版本,则可能需要尝试 Optparse 相反,模块“更方便,灵活和强大……”以及更新。 las,正如Pynt回答的那样,似乎无法完全得到您想要的东西。

Python的GetOpt应该真正支持可选的ARG,例如在指定参数时使用'='的GNU GetOpt。现在,您可以很容易地模拟它,并通过隐式更改为 - option =。

即,您可以指定-Option需要一个参数,然后将 - option调整为 - option =如下:

for i, opt in enumerate(sys.argv):
    if opt == '--option':
        sys.argv[i] = '--option='
    elif opt == '--':
        break
许可以下: CC-BY-SA归因
不隶属于 StackOverflow
scroll top