Python argparse - Add argument to multiple subparsers
argparse, python
Solution
Update by @hpaulj
Due to changes in handling subparsers since 2011, it is a bad idea to use the main parser as a `parent`. More generally, don't try to define the same argument (same `dest`) in both main and sub parsers. The subparser values will overwrite anything set by the main (even the subparser `default` does this). Create separate parser(s) to use as `parents`. And as shown in the documentation, parents should use `add_help=False`.
Original answer
This can be achieved by defining a parent parser containing the common option(s):
import argparse
parent_parser = argparse.ArgumentParser(description="The parent parser")
parent_parser.add_argument("-p", type=int, required=True,
help="set db parameter")
subparsers = parent_parser.add_subparsers(title="actions")
parser_create = subparsers.add_parser("create", parents=[parent_parser],
add_help=False,
description="The create parser",
help="create the orbix environment")
parser_create.add_argument("--name", help="name of the environment")
parser_update = subparsers.add_parser("update", parents=[parent_parser],
add_help=False,
description="The update parser",
help="update the orbix environment")
This produces help messages of the format:
parent_parser.print_help()
Output:
usage: main.py [-h] -p P {create,update} ...
The parent parser
optional arguments:
-h, --help show this help message and exit
-p P set db parameter
actions:
{create,update}
create create the orbix environment
update update the orbix environment
parser_create.print_help()
Output:
usage: main.py create [-h] -p P [--name NAME] {create,update} ...
The create parser
optional arguments:
-h, --help show this help message and exit
-p P set db parameter
--name NAME name of the environment
actions:
{create,update}
create create the orbix environment
update update the orbix environment
However, if you run your program, you will not encounter an error if you do not specify an action (i.e. `create` or `update`). If you desire this behavior, modify your code as follows.
<...>
subparsers = parent_parser.add_subparsers(title="actions")
subparsers.required = True
subparsers.dest = 'command'
<...>
This fix was brought up in this SO question which refers to an issue tracking a pull request.
Problem
My script defines one main parser and multiple subparsers. I want to apply the `-p` argument to some subparsers. So far the code looks like this: ``` parser = argparse.ArgumentParser(prog="myProg") subparsers = parser.add_subparsers(title="actions") parser.add_argument("-v", "--verbose", action="store_true", dest="VERBOSE", help="run in verbose mode") parser_create = subparsers.add_parser ("create", help = "create the orbix environment") parser_create.add_argument ("-p", type = int, required = True, help = "set db parameter") # Update parser_update = subparsers.add_parser ("update", help = "update the orbix environment") parser_update.add_argument ("-p", type = int, required = True, help = "set db parameter") ``` As you can see the `add_arument ("-p")` is repeated twice. I actually have a lot more subparsers. Is there a way to loop through the existing subparsers in order to avoid repetition? For the record, I am using Python 2.7