Logo Questions Linux Laravel Mysql Ubuntu Git Menu
 

Python argparse: Mutually exclusive required group with a required option

Tags:

I am trying to have a required mutually exclusive group with one required parameter. Below is the code which I have put

#!/usr/bin/python  import argparse import sys  # Check for the option provided as part of arguments def parseArgv():     parser = argparse.ArgumentParser()     group = parser.add_mutually_exclusive_group()     group.add_argument("-v", "--verbose", choices=[1,2,3,4],             help = "Increase verbosity")     group.add_argument("-q", "--quiet", action="store_true", help = "Run quietly")     name = parser.add_mutually_exclusive_group(required=True)     name.add_argument("-n", "--name", help = "Name of the virtual machine")     name.add_argument("-t", "--template", help = "Name of the template to use \             for creating vm. If path is not provided then it will be looked \             under template directory.")     parser.add_argument("-s", "--save", help = "Save the machine template. If \             path is not provided then it will be saved under template directory.");     #parser.add_argument("-k", "--kick_start", required = True, help = "Name of the \     #        kick start file. If path is not provided then it will be look into http \     #        directory.")     if len(sys.argv) == 1:         parser.print_help()     args = parser.parse_args()  if __name__ == '__main__':     parseArgv() 

Now the output of this program as follow

$ python test.py  usage: test.py [-h] [-v {1,2,3,4} | -q] (-n NAME | -t TEMPLATE) [-s SAVE]  optional arguments:   -h, --help            show this help message and exit   -v {1,2,3,4}, --verbose {1,2,3,4}                         Increase verbosity   -q, --quiet           Run quietly   -n NAME, --name NAME  Name of the virtual machine   -t TEMPLATE, --template TEMPLATE                         Name of the template to use for creating vm. If path                         is not provided then it will be looked under template                         directory.   -s SAVE, --save SAVE  Save the machine template. If path is not provided                         then it will be saved under template directory. usage: test.py [-h] [-v {1,2,3,4} | -q] (-n NAME | -t TEMPLATE) [-s SAVE] test.py: error: one of the arguments -n/--name -t/--template is required 

But if I un-comment the from line 20 - 22 then the output change as below

$ python test.py  usage: test.py [-h] [-v {1,2,3,4} | -q] (-n NAME | -t TEMPLATE) [-s SAVE] -k                KICK_START  optional arguments:   -h, --help            show this help message and exit   -v {1,2,3,4}, --verbose {1,2,3,4}                         Increase verbosity   -q, --quiet           Run quietly   -n NAME, --name NAME  Name of the virtual machine   -t TEMPLATE, --template TEMPLATE                         Name of the template to use for creating vm. If path                         is not provided then it will be looked under template                         directory.   -s SAVE, --save SAVE  Save the machine template. If path is not provided                         then it will be saved under template directory.   -k KICK_START, --kick_start KICK_START                         Name of the kick start file. If path is not provided                         then it will be look into http directory. usage: test.py [-h] [-v {1,2,3,4} | -q] (-n NAME | -t TEMPLATE) [-s SAVE] -k                KICK_START test.py: error: argument -k/--kick_start is required 

But I want that either -n / -t along with -k become mandatory. How to achieve the same.

like image 784
Abhinav Avatar asked Jun 08 '14 09:06

Abhinav


People also ask

How do you add an optional argument in Argparse?

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

How do you make an argument mandatory in Python?

required is a parameter of the ArugmentParser object's function add_argument() . By default, the arguments of type -f or --foo are optional and can be omitted. If a user is required to make an argument, they can set the keyword argument required to True .

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.

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.


1 Answers

You have already achieved it! Argparse only prints the first error it finds, so while it may look like it's only checking -k, it actually recuires -n/-t too. You can see this by actually giving it the -k argument.

If you provide the -k argument, the error message will change from test.py: error: argument -k/--kick_start is required to test.py: error: one of the arguments -n/--name -t/--template is required.

like image 50
Aleksi Torhamo Avatar answered Oct 20 '22 22:10

Aleksi Torhamo