问题
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 friendly). The below code looks need some optimization:
import argparse
parser = argparse.ArgumentParser(description='Usage options.')
parser.add_argument('-o','--options',help='Options available: run,rerun,kill, resume, suspend',required=True)
parser.add_argument('-c', '--config',help='config file input',type=file,required=False)
parser.add_argument('-j', '--id',help='id of the job',type=str,required=False)
args = parser.parse_args()
action_arg = list()
action_arg.append(args.options)
action = {'run': start_run,
'rerun': start_rerun,
'kill': kill_job,
'resume': resume_job,
'suspend': suspend_job,
'get_run': get_run,
'get_component': get_component,
'help': print_help}.get('-'.join(action_arg))
if action:
conf_file = str(args.config)
jobid = str(args.jobid)
if args.options == "run":
if conf_file == "None":
print "Job configuration is needed to start a run and job id is not needed"
sys.exit(2)
elif args.options == "rerun":
if conf_file == "None" or jobid == "None":
print "Job configuration and jobid is needed to start a rerun."
sys.exit(2)
else:
if jobid == "None":
print "Jobid is needed to perform %s action on job and configuration is not needed." %args.options
sys.exit(2)
action(conf_file, jobid)
else:
print "Usage Error:"
print_help()
Hope you get my required params for required options from code. Please let me know for detailed explanation on requirements
回答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
class Stub(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 is None: # proper test for None
print "Job configuration is needed to start a run and job id is not needed"
sys.exit(2)
elif args.options == "rerun":
if args.config is None or args.jobid is None:
print "Job configuration and jobid is needed to start a rerun."
sys.exit(2)
else:
if args.jobid is None:
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
class Stub(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)
来源:https://stackoverflow.com/questions/18328557/looking-for-best-way-of-giving-command-line-arguments-in-python-where-some-para