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.
To add an optional argument, simply omit the required parameter in add_argument() . args = parser. parse_args()if args.
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 .
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.
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.
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
.
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