I'm using Python 2.7 and the Argparse module to parse command line parameters. I have the following stripped down code, but I'd like to use subparsers and parents to make the help more obvious. I have the following usage cases that I am trying to accommodate, but I can't figure out how to do this properly with subparsers. If someone could nudge me in the right direction with a couple of generic examples, I would appreciate it.
script.py # script should execute and assume the -i switch script.py -i # script should execute in interactive mode script.py -f [fname] # The script should execute in file mode. The script takes fname as a parameter and executes. In my code below, I have the fname validated via another function, but I can't figure that out with subparsers script.py -E [endpoint] -s [start_time] -e [end_time] # The script executes in endpoint mode. The -s is mandatory with -E and -e is optional. However, if parameters are passed they must be validated with the valid_date function. I have this working in the code below, but I can't figure it out with subparsers. I may at some point also try to validate the endpoint parameter.
"-a" and "-x" are optional parameters and may be used with any of the three modes listed above. I know this is accomplished via parents. However, I can't get this working the closest I've come is code that doesn't error out. However, --help does not display existence of the switches either.
import argparsefrom time import time as timerimport sysdef valid_date(iso8601): passdef valid_file(parser, fname): pass return fnamedef file_mode(fname, audit, staging): print("Start in file mode. Audit is {} and staging is {}.".format(audit, staging)) sys.exit(0)def endpoint_mode(endpoint, start_time, end_time, audit, staging): print("Start in endpoint mode. Audit is {} and staging is {}.".format(audit, staging)) sys.exit(0)def interactive_mode(audit, staging): print("Start in interactive mode. Audit is {} and staging is {}.".format(audit, staging))def main(): parser = argparse.ArgumentParser(description="This is my test ArgParse script.") group = parser.add_mutually_exclusive_group() group.add_argument("-i", \ dest="interactive", \ action="store_true", \ help="Run the script interactively. This is the default " + \ "mode if no options are specfied.") group.add_argument("-f", \ dest="fname", \ help="Run the script against an input file.", \ metavar="FILE", \ type=lambda x: valid_file(parser, x)) group.add_argument("-E", \ dest="endpoint", help="Run the script against a specific endpoint.", metavar="ENDPOINT") parser.add_argument("-a", \ dest="audit", \ action="store_true", \ help="Audit only.") parser.add_argument("-x", \ dest="staging", \ action="store_true", \ help="Switches queries to use staging.") parser.add_argument("-s", \ dest="start_time", \ help="Specify a start date. This is mandatory with the -E switch.", \ metavar="DATE", type=valid_date) parser.add_argument("-e", \ dest="end_time", \ help="Specify an end date. This optional with the -E switch.", \ metavar="DATE") args = parser.parse_args() audit = args.audit staging = args.staging interactive = args.interactive fname = args.fname endpoint = args.endpoint start_time = args.start_time end_time = args.end_time if not len(sys.argv) > 1: interactive_mode(audit, staging) if args.interactive is True: interactive_mode(audit, staging) if '-f' in sys.argv: file_mode(fname, audit, staging) if '-E' in sys.argv: endpoint_mode(endpoint, start_time, end_time, audit, staging)