I'm trying to pass a list of arguments to a python script using the argh library. Something that can take inputs like these:
./my_script.py my-func --argA blah --argB 1 2 3 4 ./my_script.py my-func --argA blah --argB 1 ./my_script.py my-func --argA blah --argB
My internal code looks like this:
import argh @argh.arg('--argA', default="bleh", help='My first arg') @argh.arg('--argB', default=[], help='A list-type arg--except it\'s not!') def my_func(args): "A function that does something" print args.argA print args.argB for b in args.argB: print int(b)*int(b) #Print the square of each number in the list print sum([int(b) for b in args.argB]) #Print the sum of the list p = argh.ArghParser() p.add_commands([my_func]) p.dispatch()
And here's how it behaves:
$ python temp.py my-func --argA blooh --argB 1 blooh ['1'] 1 1 $ python temp.py my-func --argA blooh --argB 10 blooh ['1', '0'] 1 0 1 $ python temp.py my-func --argA blooh --argB 1 2 3 usage: temp.py [-h] {my-func} ... temp.py: error: unrecognized arguments: 2 3
The problem seems pretty straightforward: argh is only accepting the first argument, and treating it as a string. How do I make it "expect" a list of integers instead?
I see how this is done in optparse, but what about the (not-deprecated) argparse? Or using argh's much nicer decorated syntax? These seem much more pythonic.
To pass a list as a command-line argument with Python argparse, we can use the add_argument to add the argument. to call add_argument with the argument flag's short and long forms. We set nargs to '+' to let us take one or more argument for the flag.
SHORT ANSWERUse the nargs option or the 'append' setting of the action option (depending on how you want the user interface to behave). nargs='+' takes 1 or more arguments, nargs='*' takes zero or more. With append you provide the option multiple times to build up the list. Don't use type=list !!!
With argparse
, you just use type=int
import argparse parser = argparse.ArgumentParser() parser.add_argument('-a', '--arg', nargs='+', type=int) print parser.parse_args()
Example output:
$ python test.py -a 1 2 3 Namespace(arg=[1, 2, 3])
Edit: I'm not familiar with argh
, but it seems to be just a wrapper around argparse
and this worked for me:
import argh @argh.arg('-a', '--arg', nargs='+', type=int) def main(args): print args parser = argh.ArghParser() parser.add_commands([main]) parser.dispatch()
Example output:
$ python test.py main -a 1 2 3 Namespace(arg=[1, 2, 3], function=<function main at 0x.......>)
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