I’m creating a script that takes both positional and optional arguments with argparse. I have gone through Doug’s tutorial and the python Docs but can’t find an answer.
parser = argparse.ArgumentParser(description='script to run')
parser.add_argument('inputFile', nargs='?', type=argparse.FileType('rt'),
parser.add_argument('inputString', action='store', nargs='?')
parser.add_argument('-option1', metavar='percent', type=float, action='store')
parser.add_argument('-option2', metavar='outFile1', type=argparse.FileType('w'),
parser.add_argument('-option3', action='store', default='<10',
args = parser.parse_args()
# rest of script.... blah blah
As you can see, I want 2 positional and 3 optional arguments. However, when I try to run it in the terminal, it doesn’t check for the positionals!
If I try: python script.py inputfile
it will run normally and output error halfway through the script when it cannot find a value for inputString.
If I try: python script.py xxx ; the output is:
usage script.py [-h] [-option1] [-option2] [-option3]
Can anyone explain why it doesn’t check for the positional arguments?
Your problem is that you’re specifying
nargs='?'. From the documentation:If you leave out the
nargs='?'then the argument will be required, andargparsewill display an error if it is not provided. A single argument is consumed ifaction='store'(the default).You can also specify
nargs=1; the difference is that this produces a list containing one item, as opposed to the item itself. See the documentation for more ways you can usenargs.