Подтвердить что ты не робот

Используя argparse для анализа аргументов формы "arg = val"

Я хочу использовать argparse для синтаксического анализа командных строк формы "arg = val" Например, использование будет:

script.py conf_dir=/tmp/good_conf

Чтобы добиться этого, я делаю это:

desc   = "details"
parser = argparse.ArgumentParser(description=desc, add_help=False)
args = parser.add_argument("conf_dir")
args = parser.parse_args("conf_dir=FOO".split())
args = parser.parse_args()
print args.conf_dir

Но проблема в том, что при вызове script с:

python script.py conf_dir=/tmp/good_conf

Я получаю:

conf_dir=/tmp/good_conf

Где, как я ожидаю,

/tmp/good_conf

Итак, возникает вопрос: могу ли я использовать argparse для разбора строки cmd, которая содержит пары значений имени? Любые подсказки?

Изменить: причина, по которой я хочу это сделать, а не что-то вроде --conf_dir =/tmp/good_dir, - это потому, что есть другие инструменты (написанные на другом языке), в которых используется аргумент conf_dir =/tmp/good_dir. Чтобы поддерживать согласованность, я должен был разбирать аргументы таким образом.

4b9b3361

Ответ 1

В соответствии с документация, argparse не позволяет вам иметь такие незапланированные параметры. Если вы опустите ведущий -, он предполагает, что вы описываете позиционный аргумент и ожидаете, что он будет представлен как:

python script.py /tmp/good_conf

Если вы хотите, чтобы он был необязательным, его нужно правильно пометить как флаг, вызвав его --conf_dir и вызывая script как:

python script.py --conf_dir=/tmp/good_conf

Однако для принятия пар имя-значение вы можете реализовать настраиваемое действие. В сочетании с nargs такое действие может принимать произвольное число пар имя-значение и сохранять их в результирующем объекте аргумента.

Ответ 2

Вам нужно выполнить специальное действие

class StoreNameValuePair(argparse.Action):
    def __call__(self, parser, namespace, values, option_string=None):
        n, v = values.split('=')
        setattr(namespace, n, v)

args = parser.add_argument("conf_dir", action=StoreNameValuePair)

Ответ 3

Обычный способ поместить пары значений имени в командной строке с параметрами. То есть вы бы использовали

python script.py --confdir=/tmp/good_conf

argparse, безусловно, может справиться с этим делом. См. Документы по адресу:

http://docs.python.org/library/argparse.html#option-value-syntax