如何使用Python的optparse模块创建一个接受可变参数的选项?

12 投票
6 回答
10578 浏览
提问于 2025-04-15 12:24

使用Perl的Getopt::Long模块,你可以很方便地定义命令行选项,这些选项可以接受不同数量的参数:

foo.pl --files a.txt             --verbose
foo.pl --files a.txt b.txt c.txt --verbose

那么,有没有办法直接用Python的optparse模块来做到这一点呢?根据我的了解,nargs这个选项属性可以用来指定一个固定数量的参数,但在文档中我没有看到其他的选择。

6 个回答

10

我犯了个错误:刚刚发现这个 回调示例 6

21

我花了一些时间才搞明白这个,不过你可以通过回调函数来实现你的需求。看看我在这个例子中是怎么获取任意数量的参数到“--file”这个标志的。

from optparse import OptionParser,

def cb(option, opt_str, value, parser):
        args=[]
        for arg in parser.rargs:
                if arg[0] != "-":
                        args.append(arg)
                else:
                        del parser.rargs[:len(args)]
                        break
        if getattr(parser.values, option.dest):
                args.extend(getattr(parser.values, option.dest))
        setattr(parser.values, option.dest, args)

parser=OptionParser()
parser.add_option("-q", "--quiet",
        action="store_false", dest="verbose",
        help="be vewwy quiet (I'm hunting wabbits)")
parser.add_option("-f", "--filename",
        action="callback", callback=cb, dest="file")

(options, args) = parser.parse_args()

print options.file
print args

唯一的副作用是你得到的参数是一个列表,而不是元组。不过这很容易解决,对我来说,列表更符合我的需求。

8

我觉得 optparse 这个工具不太支持你需要的功能(直接说是不支持的——正如你所注意到的,如果你愿意做一些额外的工作,比如使用回调函数的话,还是可以实现的!)。不过,你可以更简单地使用一个叫 argparse 的第三方扩展,它支持可变数量的参数(而且还增加了很多其他实用的功能)。

这个链接 介绍了 argparseadd_argument 方法——使用 nargs='*' 可以让这个选项接受零个或多个参数,'+' 则表示至少要有一个参数,等等。

撰写回答