Logo Questions Linux Laravel Mysql Ubuntu Git Menu
 

How to make a short and long version of a required argument using Python Argparse?

I want to specify a required argument called inputdir but I also would like to have a shorthand version of it called i. I don't see a concise solution to do this without making both optional arguments and then doing my own check. Is there a preferred practice for this that I'm not seeing or the only way is to make both optional and do my own error-handling?

Here is my code:

import argparse parser = argparse.ArgumentParser() parser.add_argument("inputdir", help="Specify the input directory") parser.parse_args() 
like image 989
user3621633 Avatar asked Feb 20 '15 21:02

user3621633


People also ask

How do you make an argument optional in Argparse?

To add an optional argument, simply omit the required parameter in add_argument() . args = parser. parse_args()if args.

What is Argparse ArgumentParser ()?

The argparse module provides a convenient interface to handle command-line arguments. It displays the generic usage of the program, help, and errors. The parse_args() function of the ArgumentParser class parses arguments and adds value as an attribute dest of the object.

What is Store_true in Python?

The store_true option automatically creates a default value of False. Likewise, store_false will default to True when the command-line argument is not present.


1 Answers

For flags (options starting with - or --) pass in options with the flags. You can specify multiple options:

parser.add_argument('-i', '--inputdir', help="Specify the input directory") 

See the name or flags option documentation:

The add_argument() method must know whether an optional argument, like -f or --foo, or a positional argument, like a list of filenames, is expected. The first arguments passed to add_argument() must therefore be either a series of flags, or a simple argument name.

Demo:

>>> import argparse >>> parser = argparse.ArgumentParser() >>> parser.add_argument('-i', '--inputdir', help="Specify the input directory") _StoreAction(option_strings=['-i', '--inputdir'], dest='inputdir', nargs=None, const=None, default=None, type=None, choices=None, help='Specify the input directory', metavar=None) >>> parser.print_help() usage: [-h] [-i INPUTDIR]  optional arguments:   -h, --help            show this help message and exit   -i INPUTDIR, --inputdir INPUTDIR                         Specify the input directory >>> parser.parse_args(['-i', '/some/dir']) Namespace(inputdir='/some/dir') >>> parser.parse_args(['--inputdir', '/some/dir']) Namespace(inputdir='/some/dir') 

However, the first element for required arguments is just a placeholder. - and -- options are always optional (that's the command line convention), required arguments are never specified with such switches. Instead the command-line help will show where to put required arguments with a placeholder based on the first argument passed to add_argument(), which is to be passed in without dashes.

If you have to break with that convention and use an argument starting with - or -- that is required anyway, you'll have to do your own checking:

args = parser.parse_args() if not args.inputdir:     parser.error('Please specify an inputdir with the -i or --inputdir option') 

Here the parser.error() method will print the help information together with your error message, then exit.

like image 88
Martijn Pieters Avatar answered Sep 24 '22 06:09

Martijn Pieters