使用 Perl Getopt::Long
,您可以轻松定义带有可变数量参数的命令行选项:
foo.pl --files a.txt --verbose
foo.pl --files a.txt b.txt c.txt --verbose
有没有办法直接用 Python 的optparse
模块做到这一点?据我所知,nargs
option 属性可用于指定固定数量的选项参数,我在文档中没有看到其他替代方法。
我花了一点时间才弄清楚,但是您可以使用回调操作来完成此操作。在这个例子中查看我如何将任意数量的 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
唯一的副作用是您将参数放在列表而不是元组中。但这很容易解决,对于我的特定用例,需要一个列表。
我的错误:刚刚找到这个回调示例 6。
你这样做不是更好吗?
foo.pl --files a.txt,b.txt,c.txt --verbose
我自己最近也遇到了这个问题:我使用的是 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 > 0 时,OptionParser 将从 rargs 弹出项目并在调用任何回调之前将它们分配给 value。因此,对于未指定 nargs 的选项,在调用回调时,rargs 将始终关闭。
此回调可用于任意数量的选项,只需将 callback_args 设为要调用的函数,而不是 setattr。
这是一种方法:将 fileLst 生成字符串作为字符串,然后使用http://docs.python.org/2/library/glob.html进行扩展,如果不转义 *,这可能无法工作
实际上,有一个更好的方法: python myprog.py -V -l 1000 /home/dominic/radar/*.json <- 如果这是你的命令行
解析器,选择 = parse_args()
inFileLst = parser.largs