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"