12

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

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

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

4

6 回答 6

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

唯一的副作用是您将参数放在列表而不是元组中。但这很容易解决,对于我的特定用例,需要一个列表。

于 2010-02-05T07:06:31.430 回答
10

我的错误:刚刚找到这个回调示例 6

于 2009-06-22T01:40:37.097 回答
8

我相信optparse不支持你需要的东西(不是直接的——正如你所注意到的,如果你愿意做回调的所有额外工作,你可以做到这一点!-)。您也可以使用第三方扩展argparse最简单地做到这一点,它确实支持可变数量的参数(并且还添加了其他一些方便的功能)。

此 URL文档argparseadd_argument-- 传递nargs='*'允许选项采用零个或多个参数,'+'允许它采用一个或多个参数,等等。

于 2009-06-22T01:41:19.937 回答
2

你这样做不是更好吗?

foo.pl --files a.txt,b.txt,c.txt --verbose
于 2009-06-22T01:48:31.200 回答
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 > 0 时,OptionParser 将从 rargs 弹出项目并在调用任何回调之前将它们分配给 value。因此,对于未指定 nargs 的选项,在调用回调时,rargs 将始终关闭。

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

于 2015-06-10T21:55:18.023 回答
0

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

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

解析器,选择 = parse_args()

inFileLst = parser.largs

于 2013-03-01T16:57:35.840 回答