20

我想使用 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

4 回答 4

27

您需要自定义操作

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

args = parser.add_argument("conf_dir", action=StoreNameValuePair)
于 2012-08-01T15:00:21.067 回答
5

根据文档argparse本机不允许您使用这样的无前缀选项。如果您省略前导-,它假定您正在描述一个位置参数并期望它提供为:

python script.py /tmp/good_conf

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

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

但是,要接受名称-值对,您可以实现自定义操作。结合nargs,这样的动作可以接受任意数量的名称-值对并将它们存储在参数解析结果对象中。

于 2011-03-01T13:09:05.223 回答
2

@chepner 这太好了。我对此进行了改进以支持多个参数并将结果存储为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)
于 2018-11-13T15:26:16.930 回答
1

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

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

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

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

于 2011-03-01T13:05:14.450 回答