有没有办法说服Python的getopt处理选项的可选参数?

8 投票
5 回答
16796 浏览
提问于 2025-04-15 14:53

根据我看到的关于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 这个模块,它会更灵活一些。

撰写回答