Asked By – John Allard
I’m trying to write a script that accepts multiple input sources and does something to each one. Something like this
./my_script.py \ -i input1_url input1_name input1_other_var \ -i input2_url input2_name input2_other_var \ -i input3_url input3_name # notice inputX_other_var is optional
But I can’t quite figure out how to do this using
argparse. It seems that it’s set up so that each option flag can only be used once. I know how to associate multiple arguments with a single option (
nargs='+'), but that still won’t let me use the
-i flag multiple times. How do I go about accomplishing this?
Just to be clear, what I would like in the end is a list of lists of strings. So
[["input1_url", "input1_name", "input1_other"], ["input2_url", "input2_name", "input2_other"], ["input3_url", "input3_name"]]
Now we will see solution for issue: Using the same option multiple times in Python’s argparse
Here’s a parser that handles a repeated 2 argument optional – with names defined in the
parser=argparse.ArgumentParser() parser.add_argument('-i','--input',action='append',nargs=2, metavar=('url','name'),help='help:') In : parser.print_help() usage: ipython2.7 [-h] [-i url name] optional arguments: -h, --help show this help message and exit -i url name, --input url name help: In : parser.parse_args('-i one two -i three four'.split()) Out: Namespace(input=[['one', 'two'], ['three', 'four']])
This does not handle the
2 or 3 argument case (though I wrote a patch some time ago for a Python bug/issue that would handle such a range).
How about a separate argument definition with
metavar can also be used with
nargs='*'; the 2 strings are used as
[-u A [B ...]] or
[-u [A [B ...]]].
This question is answered By – hpaulj
This answer is collected from stackoverflow and reviewed by FixPython community admins, is licensed under cc by-sa 2.5 , cc by-sa 3.0 and cc by-sa 4.0