Игнорирование нераспознанных опций при разборе argv? - PullRequest
0 голосов
/ 28 июля 2011

Я пишу скрипт, который действует как прокси для метода 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 ]

3 голосов
/ 28 июля 2011

То, что вы хотите, находится в библиотеке 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 голосов
/ 28 июля 2011

Я только что обнаружил, что 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

Мне особенно нравится это решение, поскольку оно дает пользователю немного больше гибкости в том, как он хочет упорядочить параметры.

0 голосов
/ 28 июля 2011

Вам повезло. Я написал модифицированный getopt , который делает именно это. Однако есть одно ограничение: короткие варианты должны предшествовать длинным. Это может быть исправлено.

0 голосов
/ 28 июля 2011

Используйте регулярное выражение для поиска 'plugin=, и, если найдено, разделите строку и используйте getopt для разбора каждой половины.

0 голосов
/ 28 июля 2011

Вы можете сделать что-то глупое и просто создать словарь, из которого вы можете искать ключи и тому подобное, чтобы определить, что делать с каждым элементом ...

#!/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
...