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