Question

I am writing a program like:

import argparse

def task1(args):
    print "running task 1"

def task2(args):
    print "running task 2"


if __name__=="__main__":
    parser=argparse.ArgumentParser(description="How can I have mutually exclusive groups in subparsers?")
    subparsers=parser.add_subparsers()
    t1sub=subparsers.add_parser("task1")
    #....
    t1sub.set_defaults(func=task1)
    # here I would like to have a mutually exclusive group
    # when task 1 of the option one between --in and --out is required, but one excludes the other
    # apparently a subparser has no add_group() not add_mutually_exclusive_group(), though
    t2sub=subparsers.add_parser("task2")
    #....
    t1sub.set_defaults(func=task2)

    args = parser.parse_args()

    args.func(args)

As explained when I run task1 one between --in or --out is required but not both. How can I add this functionality to my program??

Was it helpful?

Solution

Subparsers support all the methods a normal parser supports, including add_mutually_exclusive_group():

>>> megroup = t1sub.add_mutually_exclusive_group()
>>> megroup.add_argument('--in', action='store_true')
_StoreTrueAction(option_strings=['--in'], dest='in', nargs=0, const=True, default=False, type=None, choices=None, help=None, metavar=None)
>>> megroup.add_argument('--out', action='store_true')
_StoreTrueAction(option_strings=['--out'], dest='out', nargs=0, const=True, default=False, type=None, choices=None, help=None, metavar=None)
>>> parser.parse_args(['task1', '--in'])
Namespace(func=<function task1 at 0x10a0d9050>, in=True, out=False)
>>> t1sub.print_help()
usage:  task1 [-h] [--in | --out]

optional arguments:
  -h, --help  show this help message and exit
  --in
  --out
>>> parser.print_help()
usage: [-h] {task1,task2} ...

How can I have mutually exclusive groups in subparsers?

positional arguments:
  {task1,task2}

optional arguments:
  -h, --help     show this help message and exit
Licensed under: CC-BY-SA with attribution
Not affiliated with StackOverflow
scroll top