Использование 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