argparse: identify which subparser was used
Rise to the top 3% as a developer or hire one of them at Toptal: https://topt.al/25cXVn
--------------------------------------------------
Music by Eric Matyas
https://www.soundimage.org
Track title: Isolated
--
Chapters
00:00 Argparse: Identify Which Subparser Was Used
00:34 Accepted Answer Score 96
01:35 Answer 2 Score 397
02:07 Thank you
--
Full question
https://stackoverflow.com/questions/8250...
--
Content licensed under CC BY-SA
https://meta.stackexchange.com/help/lice...
--
Tags
#python #argparse
#avk47
ANSWER 1
Score 397
A simpler solution is to add dest to the add_subparsers call. This is buried a bit further down in the documentation:
[...] If it is necessary to check the name of the subparser that was invoked, the dest keyword argument to the add_subparsers() call will work
In your example replace:
subparsers = parser.add_subparsers(help='commands')
with:
subparsers = parser.add_subparsers(help='commands', dest='command')
Now if you run:
print parser.parse_args(["all"])
you will get
Namespace(command='all')
ACCEPTED ANSWER
Score 96
Edit: Please see quornian's answer to this question, which is better than mine and should be the accepted answer.
According to the argparse documentation the result of parser.parse_args(...) will "only contain attributes for the main parser and the sub parser that was selected". Unfortunately this may not be enough information to determine which sub parser was used. The documentation recommends using the set_defaults(...) method on the sub parser to solve this problem.
For example, I've added calls to set_defaults() to your code:
import argparse
parser = argparse.ArgumentParser( version='pyargparsetest 1.0' )
subparsers = parser.add_subparsers(help='commands')
# all
all_parser = subparsers.add_parser('all', help='process all apps')
all_parser.set_defaults(which='all')
# app
app_parser = subparsers.add_parser('app', help='process a single app')
app_parser.add_argument('appname', action='store', help='name of app to process')
app_parser.set_defaults(which='app')
Now if you run
print parser.parse_args(["all"])
The result is
Namespace(which='all')
Check out the add_subparsers() documentation for more information and another example.