Я пишу оболочку для своего проекта, которая по дизайну анализирует команды, которые выглядят так:
COMMAND_NAME ARG1 = "Длинное значение" ARG2 = 123 [email protected]
Моя проблема в том, что библиотеки синтаксического анализа командной строки Python (getopt и optparse) заставляют меня использовать '-' или '-' перед аргументами. Такое поведение не соответствует моим требованиям.
Есть идеи, как это можно решить? Любая существующая библиотека для этого?
@Ralph: optparse отлично справляется с "Long Value".






Я не верю, что без достаточно интенсивной операции с 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 ('=')
args = dict (arg.split ('=', 1) для аргумента в shlex.split (cmdln_args))
Небольшая питоническая вариация на шлекс-ответ Ironforggy:
args = dict( arg.split('=', 1) for arg in shlex.split(cmdln_args) )
упс ... - поправил.
спасибо, J.F. Sebastian (нужно помнить те выражения генератора с одним аргументом).
Попробуйте следовать "Стандарты интерфейсов командной строки"
Преобразуйте свои аргументы (как предложил Томас) в формат 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, я думаю, что предложенное вами изменение этого вопроса должно было быть комментарием - указание на то, что предлагаемое решение не будет работать, довольно радикально меняет смысл ответа. :)
Немного поздно на вечеринку ... но PEP 389 позволяет это и многое другое.
Вот небольшая хорошая библиотека, если она понадобится вашей версии Python code.google.com/p/argparse
Наслаждаться.
Возможно, вас заинтересует небольшой модуль Python, который я написал, чтобы упростить обработку аргументов командной строки (с открытым исходным кодом и бесплатно) - http://freshmeat.net/projects/commando
Этот пробел в «длинном значении» может доставить вам дополнительные проблемы. Я не уверен, что optparse (или другие библиотеки) справятся с этим.