使用argparse解析形式为“arg = val”的参数

时间:2011-03-01 12:48:32

标签: python parsing command-line argparse

我想使用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行吗? 任何提示?

编辑:我想这样做的原因而不是像--conf_dir = / tmp / good_dir这样的东西是因为还有其他工具(用其他语言编写),它使用conf_dir = / tmp / good_dir样式的参数。为了保持一致性,我是以这种方式解析args。

4 个答案:

答案 0 :(得分:24)

您需要自定义操作

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)

答案 1 :(得分:5)

根据the documentationargparse本身并不允许您拥有这样的无前缀选项。如果省略前导-,则假定您正在描述位置参数,并期望将其提供为:

python script.py /tmp/good_conf

如果您希望它是可选的,则需要通过调用它--conf_dir将其正确标记为标志,并调用如下脚本:

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

但是,要接受名称 - 值对,您可以实现custom action。与nargs结合使用时,此类操作可以接受任意数量的名称 - 值对,并将它们存储在参数解析结果对象中。

答案 2 :(得分:1)

在命令行中放置名称值对的常用方法是使用选项。即你会用

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

argparse当然可以处理这种情况。请参阅以下文档:

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

答案 3 :(得分:0)

@chepner太好了。我对此进行了改进,以支持多个arg并将结果存储为dict:

class StoreDict(argparse.Action):
    def __call__(self, parser, namespace, values, option_string=None):
        kv={}
        if not isinstance(values, (list,)):
            values=(values,)
        for value in values:
            n, v = value.split('=')
            kv[n]=v
        setattr(namespace, self.dest, kv)