2015-09-04 170 views
0

这是我的命令行脚本如何从argparse获取参数名称?

import argparse 


parser = argparse.ArgumentParser('My command line app') 

parser.add_argument('--start', type=start, metavar='HOST', dest='result', nargs='*', default='all', help='Start hosts') 
parser.add_argument('--stop', type=stop, metavar='HOST', dest='result', nargs='*', default='all', help='Stop hosts') 
parser.add_argument('--status', type=status, metavar='HOST', dest='result', nargs='*', default='all', help='Show hosts status') 

args = parser.parse_args() 

目前,我为每个选项定义一个函数,但我想他们包裹在一个只有这三个选项。然后我需要知道使用了哪个参数。 argparse可能吗?

解决方案

最后我把这种方式:

import argparse 


def wrapper(command, hosts): 
    pass 


parser = argparse.ArgumentParser('My script') 
parser.add_argument('action', choices=['start', 'stop', 'status'], help='Action') 
parser.add_argument('hosts', metavar='HOST', nargs='*', default='all') 

args = parser.parse_args() 

wrapper(args.action, args.hosts) 

回答

2

这听起来像更理智的方式来处理,这将是choices参数:

commands = {'start': start, 'stop': stop, 'status': status} 

parser = argparse.ArgumentParser('My command line app') 
parser.add_argument('command', choices=commands.keys()) 
parser.add_argument('hosts', nargs='*', default=[]) 
args = parser.parse_args() 

commands[args.command](*args.hosts) 
+0

又如何能我得到这个选项的主机列表:python commandline.py --status 44.44.44.44 55.55.55.55 – AntonioRomero

+0

我会将它们作为单独的参数添加,如上更新。这将CLI API更改为'my.py start foo bar baz',每个调用只有一个可能的命令,而不是多个混合命令,但是这对我来说看起来更加安全。 – deceze

+0

我不得不编辑命令,因为我只需要三个选项的包装器,最后添加args.command作为第一个函数参数。但是你的答案真的很好,谢谢! – AntonioRomero