Using argparse to parse arguments of form "arg= val"

@chepner This is great. I improved this to support multiple args as well and store the result as 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)

As per the documentation, argparse doesn't natively let you have unprefixed options like that. If you omit the leading -, it assumes you are describing a positional argument and expects it to be provided as:

python script.py /tmp/good_conf

If you want it to be optional, it needs to be correctly marked as a flag by calling it --conf_dir, and invoking the script like:

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

However, to accept name-value pairs, you can implement a custom action. In combination with nargs, such an action could accept an arbitrary number of name-value pairs and store them on the argument parsing result object.


The usual way to put name value pairs on the command line is with options. I.e. you would use

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

argparse can certainly handle that case. See the docs at:

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


You need a custom action

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)