根据 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 模块,因为它“更方便、更灵活、更强大……”,而且更新。唉,正如 Pynt 回答的那样,似乎不可能得到你想要的东西。
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