In my example below, I am trying to setup the following command line scenarios:
$ myapp.py flowers [-h] $ myapp.py flowers plants [-h] $ myapp.py flowers plants add [-h] The actual outcomes are:
$ python myapp.py flowers usage: myapp.py flowers [-h] {plants} ... myapp.py flowers: error: too few arguments $ python myapp.py flowers plants usage: myapp.py flowers plants [-h] [--format {plain,json}] {add} ... myapp.py flowers plants: error: too few arguments $ python myapp.py flowers plants add Adding flowers... The input format is expected to be plain The problem is the second scenario. I intend for it to be an implicit "list" operation. How to do this?
Here is the source code to my example.
import sys import argparse def _flowers_plants_list(args): print('if this were real, the output format would be %s' % (args.format)) print('Here are all the flowers:') print('flower 1: rose') print('flower 2: tulip') print('flower 3: daisy') def _flowers_plants_add(args): print('Adding flowers... The input format is expected to be %s' % (args.format)) def main(): # myapp.py parser_main = argparse.ArgumentParser() subparsers_main = parser_main.add_subparsers() # myapp.py flowers [-h] parser_flowers = subparsers_main.add_parser("flowers") subparsers_flowers = parser_flowers.add_subparsers() # (this is supposed to be an implicit list - NOT WORKING) # myapp.py flowers plants [-h] parser_flowers_plants = subparsers_flowers.add_parser("plants") parser_flowers_plants.add_argument("--format", default='plain', choices=['plain', 'json'], help="what format should the result be in") parser_flowers_plants.set_defaults(func=_flowers_plants_list) subparsers_flowers_plants = parser_flowers_plants.add_subparsers() # myapp.py flowers plants add [-h] parser_flowers_plants_add = subparsers_flowers_plants.add_parser("add") parser_flowers_plants_add.add_argument("--format", default='plain', choices=['plain', 'json'], help="what format will the input be in") parser_flowers_plants_add.set_defaults(func=_flowers_plants_add) args = parser_main.parse_args() r = args.func(args) return r if __name__ == "__main__": sys.exit(main())
subparsersare optional (that's mistake that's here to stay). In older onessubparsersare required. It looks like that's what's happening here. Theparser_flowers_plantsparser is complaining that it can't find an argument (with{'add'}choices).