Python: argparse optional arguments without dashes

jvm picture jvm · Jul 3, 2012 · Viewed 10.5k times · Source

I would like to have the following syntax:

python utility.py file1 FILE1 file2 FILE2

where file1 and file2 are optional arguments. It is simple to make it working with this syntax:

python utility.py --file1 FILE1 --file2 FILE2

using

parser.add_argument('--file1',type=file)
parser.add_argument('--file2',type=file)

however, if I remove the dashes, argparse starts to interprete it as a positional rather than optional argument...

In other words, is it possible to specifically tell argparse whether an argument is optional or positional so that I can have optional parameters without the dashes?

Answer

mgilson picture mgilson · Jul 3, 2012

There is no way to get argparse to do this for you. However, you can make argparse accept any number of positional arguments:

parser.add_argument('FILES',nargs='*')
options=parser.parse_args()
file1,optional_files=options.FILES[0],options.FILES[1:]

Of course, you may want to add some checks to make sure that at least 1 file was given, etc.

EDIT

I'm still not 100% sure what you want here, but if file1 and file2 are literal strings, you can work around that a little bit by preprocessing sys.argv. Of course, this will still format your help message strangely, but you can always add an epilog explaining that either form is OK:

import argparse
import sys

mangle_args=('file1','file2')
arguments=['--'+arg if arg in mangle_args else arg for arg in sys.argv[1:]]

parser=argparse.ArgumentParser()
parser.add_argument('--file1')
parser.add_argument('--file2')
options=parser.parse_args(arguments)