你好我试图发送命令行参数的第一次。 条件是一个参数是必需的一个选项,并为他人等参数。(寻找用户友好的)。 下面的代码看起来需要一些优化:
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()
希望你能收到我的要求PARAMS从代码所需的选项。 请让我知道关于要求详细解释
在你的脚本这种变化运行,并清除几件事情。 它使用choices
控制选项的值。 它省略了其他不必要的参数add_argument
电话。 它简化了后parse_args
逻辑。 help
是不是真的需要,因为总是有-h
选项,但我把它作为一个选择。 它属于贯穿始终,因为它不是在action
字典。
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()
此版本替换options
与subparsers选择。 config
和jobid
成为适当subparsers必需的参数。 我用parents
方便地定义所需的混搭。 现在argparse
做了所有检查。
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)
文章来源: 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