根据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
答案 0 :(得分:9)
答案 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