Skip to content Skip to sidebar Skip to footer

Looking For Best Way Of Giving Command Line Arguments In Python, Where Some Params Are Req For Some Option And Some Params Are Req For Other Options

Hi i am trying to send command line arguments for first time. The condition is that one parameter is required for one option and for others other parameter.(looking for user friend

Solution 1:

This variation on your script runs, and cleans up several things. It uses choices to control the options values. It omits unnecessary parameters in the other add_argument calls. It simplifies the post parse_args logic. help isn't really needed since there is always the -h option, but I included it as a choice. It falls through to the end because it is not in the action dictionary.

import argparse
import sys
classStub(object):
    def__init__(self,s):
        self.s = s
    def__call__(self,conf_file, jobid):
        print self.s, conf_file, jobid
parser = argparse.ArgumentParser(description='Usage options.')
parser.add_argument('-o','--options', choices=('run','rerun','kill', 'resume', 'suspend','help'),required=True)
parser.add_argument('-c', '--config',help='config file input')
# optionals normally not required; 'file' not valid type# argparse.FileType will open the file
parser.add_argument('-j', '--jobid',help='id of the job')
# str is the default type
args = parser.parse_args()
# action_arg = [args.options]
action = {'run': Stub('start_run'),
          'rerun': Stub('start_rerun'),
          'kill': Stub('kill_job'),
          'resume': Stub('resume_job'),
          'suspend': Stub('suspend_job'),
          #'get_run': get_run, # not in choices#'get_component': get_component,#'help': print_help,
          }.get(args.options)  # what's with the '-'.join?if action:
    if args.options == "run":
        if args.config isNone: # proper test for Noneprint"Job configuration is needed to start a run and job id is not needed"
            sys.exit(2)
    elif args.options == "rerun":
        if args.config isNoneor args.jobid isNone:
            print"Job configuration and jobid is needed to start a rerun."
            sys.exit(2)
    else:
        if args.jobid isNone:
            print"Jobid is needed to perform %s action on job and configuration is not needed." %args.options
            sys.exit(2)
    action(args.config, args.jobid)
else:
    print"Usage Error:"
    parser.print_help()

This version replaces the options choices with subparsers. config and jobid become required arguments for the appropriate subparsers. I use parents to conveniently define the required mix and match. Now argparse does all the checking.

import argparse
classStub(object):
    def__init__(self,s):
        self.s = s
    def__call__(self,conf_file, jobid):
        print self.s, conf_file, jobid

conf_parent = argparse.ArgumentParser(add_help=False)
conf_parent.add_argument('-c', '--config',help='config file input',required=True)
job_parent = argparse.ArgumentParser(add_help=False)
job_parent.add_argument('-j', '--jobid',help='id of the job',required=True)

parser = argparse.ArgumentParser(description='Usage options.')
parser.set_defaults(config=None, jobid=None) # put default value in namespace
sp = parser.add_subparsers(dest='options')
sp.add_parser('run',parents=[conf_parent])
sp.add_parser('rerun',parents=[conf_parent, job_parent])
sp.add_parser('kill',parents=[job_parent])
sp.add_parser('resume',parents=[job_parent])
sp.add_parser('suspend',parents=[job_parent])
args = parser.parse_args()

action = {'run': Stub('start_run'),
          'rerun': Stub('start_rerun'),
          'kill': Stub('kill_job'),
          'resume': Stub('resume_job'),
          'suspend': Stub('suspend_job'),
          }.get(args.options)
action(args.config, args.jobid)

Post a Comment for "Looking For Best Way Of Giving Command Line Arguments In Python, Where Some Params Are Req For Some Option And Some Params Are Req For Other Options"