使用Perl的Getopt::Long
,您可以轻松定义接受可变数量参数的命令行选项:
foo.pl --files a.txt --verbose
foo.pl --files a.txt b.txt c.txt --verbose
有没有办法直接使用Python的optparse
模块来实现这个功能?据我所知,nargs
选项属性可用于指定一定数量的选项参数,并且在文档中我没有看到其他替代方案。
这花了我一点时间才弄清楚,但你可以使用回调操作来将选项设置为完成此操作。请查看我在此示例中如何获取“--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
唯一的副作用是你获得一个参数列表而不是元组。但这可以很容易地解决,对于我的特定用例,列表是理想的。
foo.pl --files a.txt,b.txt,c.txt --verbose
foo.py *.txt
这样的 shell 扩展。 - Constantiniusdef 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()
def arg_list(option, opt_str, value, parser):
args = set()
rargs = parser.rargs[:]
for arg in rargs:
etc... 我试图格式化它!
- temporary1
foo.pl a.txt b.txt c.txt --verbose
。在这种情况下,文件名将被放置在参数中。 - jfs