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

0 投票
5 回答
2113 浏览
提问于 2025-04-16 22:24

我正在写一个脚本,这个脚本的作用是作为一个插件类的 run 方法的代理。

这个脚本的调用方式是这样的:

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

这个命令的结果相当于:

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

需要注意的是,--plugin 前面的内容是由 main.py 内部使用的,不会传递给插件。而 --plugin 后面的内容则会被 main.py 忽略,直接传递给插件。

我遇到的问题是,我找不到一个类似 getopt 的类,能够让我解析 argv,而不需要指定一个允许的选项列表。

我希望不必重写 getopt,只为了一行注释掉的代码。有没有更好的选择呢?

5 个回答

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
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'])
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

我特别喜欢这个解决方案,因为它给用户在参数顺序上提供了一些额外的灵活性。

撰写回答