With python's argparse, how do I make a subcommand a required argument? I want to do this because I want argparse to error out if a subcommand is not specified. I override the error method to print help instead. I have 3-deep nested subcommands, so it's not a matter of simply handling zero arguments at the top level.
In the following example, if this is called like so, I get:
$./simple.py $
What I want it to do instead is for argparse to complain that the required subcommand was not specified:
import argparse class MyArgumentParser(argparse.ArgumentParser): def error(self, message): self.print_help(sys.stderr) self.exit(0, '%s: error: %s\n' % (self.prog, message)) def main(): parser = MyArgumentParser(description='Simple example') subs = parser.add_subparsers() sub_one = subs.add_parser('one', help='does something') sub_two = subs.add_parser('two', help='does something else') parser.parse_args() if __name__ == '__main__': main()
To add an optional argument, simply omit the required parameter in add_argument() . args = parser. parse_args()if args.
Adding arguments Later, calling parse_args() will return an object with two attributes, integers and accumulate . The integers attribute will be a list of one or more ints, and the accumulate attribute will be either the sum() function, if --sum was specified at the command line, or the max() function if it was not.
A “subparser” is an argument parser bound to a namespace. In other words, it works with everything after a certain positional argument. Argh implements commands by creating a subparser for every function.
There was a change in 3.3 in the error message for required arguments, and subcommands got lost in the dust.
http://bugs.python.org/issue9253#msg186387
There I suggest this work around, setting the required
attribute after the subparsers
is defined.
parser = ArgumentParser(prog='test') subparsers = parser.add_subparsers() subparsers.required = True subparsers.dest = 'command' subparser = subparsers.add_parser("foo", help="run foo") parser.parse_args()
A related pull-request: https://github.com/python/cpython/pull/3027
In addition to hpaulj's answer: you can also use the required
keyword argument with ArgumentParser.add_subparsers()
since Python 3.7. You also need to pass dest
as argument. Otherwise you will get an error: TypeError: sequence item 0: expected str instance, NoneType found
.
Example file example.py
:
import argparse parser = argparse.ArgumentParser() subparsers = parser.add_subparsers(dest='command', required=True) foo_parser = subparsers.add_parser("foo", help="command foo") args = parser.parse_args()
Output of the call without an argument:
$ python example.py usage: example.py [-h] {foo} ... example.py: error: the following arguments are required: command
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