Logo Questions Linux Laravel Mysql Ubuntu Git Menu
 

How to parse multiple nested sub-commands using python argparse?

I am implementing a command line program which has interface like this:

cmd [GLOBAL_OPTIONS] {command [COMMAND_OPTS]} [{command [COMMAND_OPTS]} ...] 

I have gone through the argparse documentation. I can implement GLOBAL_OPTIONS as optional argument using add_argument in argparse. And the {command [COMMAND_OPTS]} using Sub-commands.

From the documentation it seems I can have only one sub-command. But as you can see I have to implement one or more sub-commands. What is the best way to parse such command line arguments useing argparse?

like image 458
Vikas Avatar asked May 04 '12 11:05

Vikas


1 Answers

I came up with the same qustion, and it seems i have got a better answer.

The solution is we shall not simply nest subparser with another subparser, but we can add subparser following with a parser following another subparser.

Code tell you how:

parent_parser = argparse.ArgumentParser(add_help=False) parent_parser.add_argument('--user', '-u',                     default=getpass.getuser(),                     help='username') parent_parser.add_argument('--debug', default=False, required=False,                         action='store_true', dest="debug", help='debug flag') main_parser = argparse.ArgumentParser() service_subparsers = main_parser.add_subparsers(title="service",                     dest="service_command") service_parser = service_subparsers.add_parser("first", help="first",                     parents=[parent_parser]) action_subparser = service_parser.add_subparsers(title="action",                     dest="action_command") action_parser = action_subparser.add_parser("second", help="second",                     parents=[parent_parser])  args = main_parser.parse_args() 
like image 199
Xiongjun Liang Avatar answered Sep 22 '22 18:09

Xiongjun Liang