I want to use argparse to parse command lines of form "arg=val" For example, the usage would be:
script.py conf_dir=/tmp/good_conf
To achieve it, I am doing this:
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
But, the problem is that, on invocation of the script with:
python script.py conf_dir=/tmp/good_conf
I get:
conf_dir=/tmp/good_conf
Where as I expect
/tmp/good_conf
So, the question is: Can I use argparse to parse cmd line, which contains name value pairs? Any hints?
Edit: The reason I want to do this and not some thing like --conf_dir=/tmp/good_dir is because there are other tools (written in other language), which uses conf_dir=/tmp/good_dir style of arguments. To maintain consistency, I was to parse args in this way.
The usual way to put name value pairs on the command line is with options. I.e. you would use
argparse can certainly handle that case. See the docs at:
http://docs.python.org/library/argparse.html#option-value-syntax
@chepner This is great. I improved this to support multiple args as well and store the result as dict:
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: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: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.You need a custom action