Используя 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. Чтобы поддерживать согласованность, я должен был разбирать аргументы таким образом.
Ответы
Ответ 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