Использование 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
но, проблема в том, что при вызове скрипта с:
python script.py conf_dir=/tmp/good_conf
Я:
conf_dir=/tmp/good_conf
где, как я ожидаю
/tmp/good_conf
Итак, вопрос: Могу ли я использовать argparse для анализа строки cmd, которая содержит пары значений имен? Есть намеки?
Edit: причина Я хочу сделать это, а не что-то вроде --conf_dir=/tmp/good_dir, потому что есть другие инструменты (написанные на другом языке), которые используют стиль аргументов conf_dir=/tmp/good_dir. Чтобы сохранить последовательность, я должен был разбирать args таким образом.
3 ответов
по состоянию на документация, argparse
изначально не позволяет вам иметь неподготовленные варианты, как это. Если вы пропустите ведущий -
, Он предполагает, что вы описываете позиционный аргумент и ожидает, что он будет предоставлен как:
python script.py /tmp/good_conf
если вы хотите, чтобы он был необязательным, он должен быть правильно отмечен как флаг, вызвав его --conf_dir
и вызов скрипта, например:
python script.py --conf_dir=/tmp/good_conf
однако, чтобы принять пары имя-значение, вы можете реализовать таможня действие. В сочетании с nargs
, такое действие может принимать произвольное количество пар имя-значение и хранить их в объекте результата синтаксического анализа аргумента.
вам нужно пользовательское действие
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)
обычный способ поместить пары значений имен в командной строке - с параметрами. Т. е. вы бы использовали
python script.py --confdir=/tmp/good_conf
argparse, безусловно, может справиться с этим случаем. См. документы по адресу:
http://docs.python.org/library/argparse.html#option-value-syntax