Klaim
Klaim

Reputation: 69682

How to require one command line action argument among several possible but exclusive?

Using argparse, is there a simple way to specify arguments which are mutually exclusive so that the application asks for one of these arguments have to be provided but only one of them?

Example of fictive use-case:

> myapp.py foo --bar
"Foo(bar) - DONE"

> myapp.py read truc.txt
"Read: truc.txt - DONE"

>myapp.py foo read
Error: use "myapp.py foo [options]" or "myapp.py read [options]" (or something similar).

> myapp.py foo truc.txt
Error: "foo" action don't need additional info.

> myapp.py read --bar
Error: "read" action don't have a "--bar" option.

My goal is to have a "driver" application(1) that would internally apply one action depending on the first command line argument and have arguments depending on the action.

So far I see no obvious ways to do this with argparse without manually processing the arguments myself, but maybe I missed something Pythonic? (I'm not a Python3 expert...yet)

I call it "driver" because it might be implemented by calling another application, like gcc does with different compilers.

Upvotes: 0

Views: 48

Answers (1)

Chrispresso
Chrispresso

Reputation: 4071

What you're trying to do is actually supported quite well in Python.

See Mutual Exclusion

parser = argparse.ArgumentParser()
group = parser.add_mutually_exclusive_group(required=True)
group.add_argument('foo', dest='foo', nargs=1)
group.add_argument('read', dest='read', nargs=1)
args = parser.parse_args()
return args

Upvotes: 2

Related Questions