Настраиваемый анализ командной строки в Python - PullRequest
7 голосов
/ 01 октября 2008

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

COMMAND_NAME ARG1 = "Длинное значение" ARG2 = 123 ARG3=me@me.com

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

Есть идеи, как это можно решить? Для этого есть какая-нибудь библиотека?

Ответы [ 7 ]

10 голосов
/ 01 октября 2008

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

args = {}
for arg in shlex.split(cmdln_args):
    key, value = arg.split('=', 1)
    args[key] = value
9 голосов
/ 01 октября 2008
  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)])
2 голосов
/ 01 октября 2008

Небольшая питоническая вариация на шлекс-ответ Айронфорджи:

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

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

спасибо, Ж. Ф. Себастьян (надо запомнить эти выражения генератора одного аргумента).

1 голос
/ 19 ноября 2009

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

OptionMatcher.setMode (optionPrefix = '-')

0 голосов
/ 06 февраля 2011

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

0 голосов
/ 16 апреля 2010

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

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

.

Наслаждайтесь.

0 голосов
/ 01 октября 2008

Без довольно интенсивных операций на 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)
...