无论如何,是否有说服Python的Getopt处理选项的可选参数?
-
20-09-2019 - |
题
根据有关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
解决方案
其他提示
不幸的是,没有办法。来自 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
不隶属于 StackOverflow