有没有办法说服Python的getopt处理选项的可选参数?
根据我看到的关于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
5 个回答
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
6
很遗憾,目前没有办法实现这个功能。根据optparse的文档:
通常来说,一个选项要么需要一个参数,要么不需要。很多人希望有一个“可选参数”的功能,也就是说,有些选项如果看到参数就会使用它,如果没有看到就不使用。这种做法有点争议,因为它会让解析变得模糊:比如说,如果“-a”是一个可选参数,而“-b”是另一个完全不同的选项,那么“-ab”应该怎么理解呢?由于这种模糊性,optparse不支持这个功能。
编辑:哦,刚才说的是optparse模块,而不是getopt模块,但这两个模块都不支持“可选参数”的原因是一样的。
11
getopt
这个工具不支持可选参数。如果你使用长选项的话,可以这样做:
$ ./testopt.py --verbose=
这样做会得到一个空字符串的值。
你可以看看 argparse
这个模块,它会更灵活一些。