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

FMc*_*FMc 12 python optparse

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

foo.pl --files a.txt             --verbose
foo.pl --files a.txt b.txt c.txt --verbose
Run Code Online (Sandbox Code Playgroud)

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

Dav*_*wks 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
Run Code Online (Sandbox Code Playgroud)

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

  • 这两个在功能上是等价的,除了示例代码还允许将诸如"-1"之类的值解析为标志的args,这对于某些用例来说是一个很好的特性. (2认同)

FMc*_*FMc 10

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

  • 这绝对是确切问题的最佳答案; argparse要好得多,但你不能总是轻易使用​​它:例如.在Django管理命令中. (4认同)

Ale*_*lli 8

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

这个URL文件argparseadd_argument传递nargs='*'允许该选项接受零个或多个参数,'+'让它接受一个或多个参数等.

  • `argparse`在Python 2.7+ http://docs.python.org/library/argparse.html中 (4认同)
  • 是的,但是如果你还不能升级到2.7(前天发布),那么第三方软件包仍然是天赐之物! - ) (2认同)