使用Perl的Getopt::Long
,您可以轻松定义带有可变数量参数的命令行选项:
foo.pl --files a.txt --verbose
foo.pl --files a.txt b.txt c.txt --verbose
有没有办法直接使用Python的optparse
模块?据我所知,nargs
选项属性可用于指定固定数量的选项参数,我在文档中没有看到其他替代方法。
答案 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