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='*' or 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"]] 
                Here's a parser that handles a repeated 2 argument optional - with names defined in the metavar:
parser=argparse.ArgumentParser() parser.add_argument('-i','--input',action='append',nargs=2,     metavar=('url','name'),help='help:')  In [295]: 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 [296]: parser.parse_args('-i one two -i three four'.split()) Out[296]: 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 nargs=3 and metavar=('url','name','other')?
The tuple metavar can also be used with nargs='+' and nargs='*'; the 2 strings are used as [-u A [B ...]] or  [-u [A [B ...]]].
This is simple; just add both action='append' and nargs='*' (or '+').
import argparse parser = argparse.ArgumentParser() parser.add_argument('-i', action='append', nargs='+') args = parser.parse_args()   Then when you run it, you get
In [32]: run test.py -i input1_url input1_name input1_other_var -i input2_url i ...: nput2_name input2_other_var -i input3_url input3_name  In [33]: args.i Out[33]: [['input1_url', 'input1_name', 'input1_other_var'],  ['input2_url', 'input2_name', 'input2_other_var'],  ['input3_url', 'input3_name']] 
                        If you love us? You can donate to us via Paypal or buy me a coffee so we can maintain and grow! Thank you!
Donate Us With