有没有办法说服python的getopt处理options的可选参数?

问题描述 投票:0回答:5

根据 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
python getopt getopt-long
5个回答
12
投票

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

$ ./testopt.py --verbose=

这将导致空字符串值。

您可以发现

argparse
模块更加灵活。这取代了旧的
optparse
模块。


6
投票

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

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

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


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

0
投票

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


0
投票

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

来实现此约束

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

for i, opt in enumerate(sys.argv):
    if opt == '--option':
        sys.argv[i] = '--option='
    elif opt == '--':
        break
© www.soinside.com 2019 - 2024. All rights reserved.