И странный интерфейс командной строки для разбора аргументов - PullRequest
1 голос
/ 04 февраля 2012

У меня есть интерфейс командной строки для программы на Python, который имеет несколько параметров (скажем, --a, --b, --c), но один переключается между командами с другими переключателями.

Итак, возможно prog -S a b c вызывает действие -S, а prog -Y a b c вызывает действие -Y. Затем prog -Y a b c --a=2 --b=3 должен вызвать действие -Y с параметрами a и b и позиционным аргументом a, b, c

Есть ли способ заставить argparse или getopt выполнить анализ для меня? Есть ли какая-нибудь другая библиотека для этого?

Ответы [ 2 ]

3 голосов
/ 04 февраля 2012

Я думаю, что в этом случае было бы полезно использовать подкоманды в argparse .

По сути, вы можете создать основной синтаксический анализатор, который позаботится о разборе подкоманды вместе с некоторыми общими общими параметрами, а затем несколько подпарасеров (по одному для каждой подкоманды), которые позаботятся о разборе определенных параметров, передаваемых подкомандам. .

1 голос
/ 11 июня 2012

Я не совсем уверен, поможет ли это, но до сих пор я писал оболочку, которая принимает аргументы из XML, заданные веб-интерфейсом, а затем передает их в команду:

Очевидно, принимает более сложные строки аргументов, но для примера:

 def __main__():
 parser = optparse.OptionParser()
 parser.add_option( '-Q', '--ibmax', dest='ibmax', help='' )
 (options, args) = parser.parse_args()
 if options.ibmax != 'None' and int( options.ibmax ) >= 1:
                ibmax = '--bmax %s' % options.ibmax

 cmd1 = Popen([another.py, '-Q "%s"' % (options.ibmax),], stdout=PIPE).communicate()[0]
 process = subprocess.Popen(cmd1, stdout=subprocess.PIPE, stderr=subprocess.PIPE)

В зависимости от определенных флагов в моем веб-интерфейсе, в список аргументов добавляются дополнительные параметры, и поэтому выполняется другая команда. Добавьте каждую опцию команды в анализатор и затем проверьте значение команды -Y или -S, чтобы установить переменные и изменить, какую команду вам нужно передать.

Надеюсь, это поможет, я не профессионал в Python, это просто работает для меня.

...