2015-09-04 132 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