Require either of two arguments using argparse

PythonArgparse

Python Problem Overview


Given:

import argparse

pa = argparse.ArgumentParser()
pa.add_argument('--foo')
pa.add_argument('--bar')

print pa.parse_args('--foo 1'.split())

how do I

  • make at least one of "foo, bar" mandatory: --foo x, --bar y and --foo x --bar y are fine
  • make at most one of "foo, bar" mandatory: --foo x or --bar y are fine, --foo x --bar y is not

Python Solutions


Solution 1 - Python

I think you are searching for something like mutual exclusion (at least for the second part of your question).

This way, only foo or bar will be accepted, not both.

import argparse

parser = argparse.ArgumentParser()
group = parser.add_mutually_exclusive_group(required=True)
group.add_argument('--foo',action=.....)
group.add_argument('--bar',action=.....)
args = parser.parse_args()

BTW, just found another question referring to the same kind of issue.

Solution 2 - Python

If you need some check that is not provided by the module you can always do it manually:

pa = argparse.ArgumentParser()
...
args = pa.parse_args()

if args.foo is None and args.bar is None:
   pa.error("at least one of --foo and --bar required")

Attributions

All content for this solution is sourced from the original question on Stackoverflow.

The content on this page is licensed under the Attribution-ShareAlike 4.0 International (CC BY-SA 4.0) license.

Content TypeOriginal AuthorOriginal Content on Stackoverflow
QuestiongeorgView Question on Stackoverflow
Solution 1 - PythonjlengrandView Answer on Stackoverflow
Solution 2 - PythonsthView Answer on Stackoverflow