使用Python的optparse模块,如何创建一个带有可变数量参数的选项?

时间:2009-06-22 01:28:05

标签: python optparse

使用Perl的Getopt::Long,您可以轻松定义带有可变数量参数的命令行选项:

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

有没有办法直接使用Python的optparse模块?据我所知,nargs选项属性可用于指定固定数量的选项参数,我在文档中没有看到其他替代方法。

6 个答案:

答案 0 :(得分:21)

我花了一些时间来弄明白,但你可以使用回调动作来完成这个任务。在本例中,检查我如何将任意数量的args获取到“--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

唯一的副作用是你将args放在列表而不是元组中。但这可以很容易地修复,对于我的特定用例,列表是可取的。

答案 1 :(得分:10)

我的错误:刚发现这个Callback Example 6

答案 2 :(得分:8)

我相信optparse不支持您的要求(不是直接的 - 正如您所注意到的,如果您愿意完成回调的所有额外工作,您可以这样做! - )。您也可以使用第三方扩展argparse进行最简单的扩展,它支持可变数量的参数(并且还添加了几个其他方便的功能)。

This URL个文档argparse的{​​{1}} - 传递add_argument让该选项带有零个或多个参数,nargs='*'允许它接受一个或多个参数等等。

答案 3 :(得分:2)

这样你不会更好吗?

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

答案 4 :(得分:1)

我最近自己有这个问题:我使用的是Python 2.6,需要一个选项来获取可变数量的参数。我尝试使用Dave的解决方案,但发现如果没有明确地将nargs设置为0,它将无法工作。

def arg_list(option, opt_str, value, parser):
    args = set()
    for arg in parser.rargs:
        if arg[0] == '-':
            break
        args.add(arg)
        parser.rargs.pop(0)
    setattr(parser.values, option.dest, args)

parser=OptionParser()
parser.disable_interspersed_args()
parser.add_option("-f", "--filename", action="callback", callback=arg_list,
                  dest="file", nargs=0)

(options, args) = parser.parse_args()

问题在于,默认情况下,add_options添加的新选项被假定为nargs = 1,而当nargs> gt; 0 OptionParser会在rargs中弹出项目,并在调用任何回调之前将它们分配给值。因此,对于未指定nargs的选项,在调用回调时rargs将始终关闭。

这个回调可用于任意数量的选项,只需将callback_args作为要调用的函数而不是setattr。

答案 5 :(得分:0)

这是一种方法:将fileLst生成字符串作为字符串,然后使用http://docs.python.org/2/library/glob.html进行扩展,如果没有转义*

,这可能无效

实际上,有一个更好的方法: python myprog.py -V -l 1000 /home/dominic/radar/*.json< - 如果这是你的命令行

parser,opts = parse_args()

inFileLst = parser.largs