7

根据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
4

5 回答 5

10

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

$ ./testopt.py --verbose=

这将导致空字符串值。

你会发现argparse模块更灵活。

于 2009-10-07T16:36:27.693 回答
6

不幸的是,没有办法。从optparse 文档

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

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

于 2009-10-07T16:40:54.047 回答
3

您可以使用 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
于 2011-12-16T00:16:04.577 回答
0

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

于 2009-10-07T17:25:16.580 回答
0

python 的 getopt 应该真正支持可选参数,例如 GNU getopt,在指定参数时需要使用“=”。现在你可以很容易地模拟它,通过将 --option 隐式更改为 --option= 这个约束

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

for i, opt in enumerate(sys.argv):
    if opt == '--option':
        sys.argv[i] = '--option='
    elif opt == '--':
        break
于 2015-01-07T16:47:48.383 回答