0

我正在编写一个充当插件类run方法代理的脚本。

该脚本将像这样调用:

> main.py -v --plugin=Foo --extra=bar -c

此命令的结果将相当于:

plugin = my.module.Foo()
plugin.run(extra='bar', c=True)

请注意,前面的任何内容--plugin都由 main.py 内部使用,而不是传递给插件。main.py 忽略之后--plugin的任何内容,而是直接传递给插件。

我遇到的问题是我找不到一个getopt允许我解析argv 无需指定允许选项列表的类。

我宁愿不必getopt用注释掉的一行来重写。有没有更好的选择?

4

5 回答 5

3

您想要的是在argparse库中,请参阅http://docs.python.org/dev/library/argparse.html#partial-parsing

>>> parser = argparse.ArgumentParser()
>>> parser.add_argument('--foo', action='store_true')
>>> parser.add_argument('bar')
>>> parser.parse_known_args(['--foo', '--badger', 'BAR', 'spam'])
(Namespace(bar='BAR', foo=True), ['--badger', 'spam'])
于 2011-07-28T01:23:02.993 回答
0

我刚刚发现getopt如果遇到它会停止解析--

Python 2.6.6 (r266:84292, Jun 16 2011, 16:59:16) 
Type "help", "copyright", "credits" or "license" for more information.
>>> from getopt import getopt
>>>
>>> argv = ['-v', '--plugin=foo', '--', '--extra=bar', '-c']
>>> opts, extra = getopt(argv, 'v', 'plugin=')
>>>
>>> opts
[('-v', ''), ('--plugin', 'foo')]
>>>
>>> extra
['--extra=bar', '-c']

请注意,上面argv的内容相当于调用:

> main.py -v --plugin=Foo -- --extra=bar -c

我特别喜欢这个解决方案,因为它为用户提供了一些额外的灵活性来决定如何订购参数。

于 2011-07-28T03:23:38.287 回答
0

您可以做一些愚蠢的事情,只需生成一个字典,您可以从中查找键等以确定如何处理每个项目......

#!/usr/bin/python
import sys 
options = dict()
for pair in map(lambda item: item.lstrip('-'), sys.argv[1:]):
    pair = pair.split('=')
    if len(pair) < 2:
        option, val = pair[0], True
    else:
        option, val = pair
    options[option] = val 
print options
于 2011-07-27T23:57:46.003 回答
0

你很幸运。我写了一个修改后的 getopt就是这样做的。然而,一个限制是空头期权必须先于多头期权。那可能是可以解决的。

于 2011-07-28T01:44:59.307 回答
-1

使用正则表达式搜索'plugin=,如果找到,则拆分行并使用 getopt 解析每一半。

于 2011-07-28T01:26:47.117 回答