解析argv时忽略无法识别的选项?

时间:2011-07-27 23:20:27

标签: python getopt

我正在编写一个脚本,作为插件类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。那里有更好的选择吗?

5 个答案:

答案 0 :(得分: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'])

答案 1 :(得分: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

答案 2 :(得分:0)

你很幸运。我写了一个modified getopt就是这么做的。然而,一个限制是短期权必须在长期期权之前。这可能是可以解决的。

答案 3 :(得分:0)

我刚发现getopt will stop parsing if it encounters --

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

我喜欢这个解决方案,特别是因为它为用户提供了一些额外的灵活性,可以帮助他们订购参数。

答案 4 :(得分:-1)

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