Настроенный синтаксический анализ командной строки в Python

Я пишу оболочку для своего проекта, которая по дизайну анализирует команды, которые выглядят так:

COMMAND_NAME ARG1 = "Длинное значение" ARG2 = 123 [email protected]

Моя проблема в том, что библиотеки синтаксического анализа командной строки Python (getopt и optparse) заставляют меня использовать '-' или '-' перед аргументами. Такое поведение не соответствует моим требованиям.

Есть идеи, как это можно решить? Любая существующая библиотека для этого?

Этот пробел в «длинном значении» может доставить вам дополнительные проблемы. Я не уверен, что optparse (или другие библиотеки) справятся с этим.

Ralph 01.10.2008 14:09

@Ralph: optparse отлично справляется с "Long Value".

jfs 01.10.2008 17:12
Почему в Python есть оператор "pass"?
Почему в Python есть оператор "pass"?
Оператор pass в Python - это простая концепция, которую могут быстро освоить даже новички без опыта программирования.
Некоторые методы, о которых вы не знали, что они существуют в Python
Некоторые методы, о которых вы не знали, что они существуют в Python
Python - самый известный и самый простой в изучении язык в наши дни. Имея широкий спектр применения в области машинного обучения, Data Science,...
Основы Python Часть I
Основы Python Часть I
Вы когда-нибудь задумывались, почему в программах на Python вы видите приведенный ниже код?
LeetCode - 1579. Удаление максимального числа ребер для сохранения полной проходимости графа
LeetCode - 1579. Удаление максимального числа ребер для сохранения полной проходимости графа
Алиса и Боб имеют неориентированный граф из n узлов и трех типов ребер:
Оптимизация кода с помощью тернарного оператора Python
Оптимизация кода с помощью тернарного оператора Python
И последнее, что мы хотели бы показать вам, прежде чем двигаться дальше, это
Советы по эффективной веб-разработке с помощью Python
Советы по эффективной веб-разработке с помощью Python
Как веб-разработчик, Python может стать мощным инструментом для создания эффективных и масштабируемых веб-приложений.
7
2
4 716
7
Перейти к ответу Данный вопрос помечен как решенный

Ответы 7

Я не верю, что без достаточно интенсивной операции с optparse или getopt вы сможете разумно заставить их анализировать ваш формат. Однако вы можете легко проанализировать свой собственный формат или преобразовать его во что-то, что может обработать optparse:

parser = optparse.OptionParser()
parser.add_option("--ARG1", dest = "arg1", help = "....")
parser.add_option(...)
...
newargs = sys.argv[:1]
for idx, arg in enumerate(sys.argv[1:])
    parts = arg.split('=', 1)
    if len(parts) < 2:
        # End of options, don't translate the rest. 
        newargs.extend(sys.argv[idx+1:])
        break
    argname, argvalue = parts
    newargs.extend(["--%s" % argname, argvalue])

parser.parse_args(newargs)
Ответ принят как подходящий

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

args = {}
for arg in shlex.split(cmdln_args):
    key, value = arg.split('=', 1)
    args[key] = value

В python 2.5 и выше вы также можете: key, _, value = arg.partition ('=')

tzot 01.10.2008 16:57

args = dict (arg.split ('=', 1) для аргумента в shlex.split (cmdln_args))

jfs 01.10.2008 17:22

Небольшая питоническая вариация на шлекс-ответ Ironforggy:

args = dict( arg.split('=', 1) for arg in shlex.split(cmdln_args) )

упс ... - поправил.

спасибо, J.F. Sebastian (нужно помнить те выражения генератора с одним аргументом).

  1. Попробуйте следовать "Стандарты интерфейсов командной строки"

  2. Преобразуйте свои аргументы (как предложил Томас) в формат OptionParser.

    parser.parse_args(["--"+p if " = " in p else p for p in sys.argv[1:]])
    

Если аргументы командной строки находятся не в sys.argv или аналогичном списке, а в строке, тогда (как предлагает ironfroggy) используйте shlex.split().

parser.parse_args(["--"+p if " = " in p else p for p in shlex.split(argsline)])

А что насчет optmatch (http://www.coderazzi.net/python/optmatch/index.htm)? Не является стандартным, но использует другой подход к синтаксическому анализу параметров и поддерживает любой префикс:

OptionMatcher.setMode (optionPrefix = '-')

@rafalotufo, я думаю, что предложенное вами изменение этого вопроса должно было быть комментарием - указание на то, что предлагаемое решение не будет работать, довольно радикально меняет смысл ответа. :)

sarnold 02.06.2011 02:56

Немного поздно на вечеринку ... но PEP 389 позволяет это и многое другое.

Вот небольшая хорошая библиотека, если она понадобится вашей версии Python code.google.com/p/argparse

Наслаждаться.

Возможно, вас заинтересует небольшой модуль Python, который я написал, чтобы упростить обработку аргументов командной строки (с открытым исходным кодом и бесплатно) - http://freshmeat.net/projects/commando

Другие вопросы по теме