2012-03-08 33 views
0

我使用argh庫創建python命令行工具。幾個我使用的名稱已被證明是相當長的,例如:使用argh設置縮寫的簡單方法

./my_program.py download-and-parse-data --randomize-order --training-percent 80 

有沒有一種簡單的方法,讓縮寫?例如,以下是上述行的潛在縮寫版本。

./my_program.py dpd -r -t 80 

理想情況下,我想能夠使用命令行形式 - 長,內容豐富的版本,以及短期,易型版。有沒有一個好的方法來做到這一點?

回答

0

你可以用​​的add_subparsers()方法很容易地做到這一點。請參閱文檔here

在你的情況這可能打破這樣的:

parser = argparse.ArgumentParser() 
subs = parser.add_subparsers() 
dpd = subs.add_parser('download-and-parse-data', aliases=['dpd']) 
dpd.add_argument(...) 
... 

編輯

在每add_argument()叫你也可以使用多個參數名。請參閱文檔here。 E.g:

parser.add_argument('-f', '--foo') 
3

雖然​​答案被接受,原來的問題是如何用簡單的argh模塊做到這一點。具體方法如下:

from argh import * 
from show import show # only needed for demonstration purposes 

CMD_ALIASES = { 'dpd' : 'download-and-parse-data', 
       'dp' : 'download-and-parse-data', 
       'dd' : 'download-data', 
       'pd' : 'parse-data', } 

def choices_for(d): 
    """ 
    Return list of unique items (command aliases plus unabridged commands). 
    Works in Python >= 2.5. NB In the degenerate case when an alias and an 
    unabridged command are identical, the alias takes priority. (In my best 
    Terminator voice: Don't do dat.) 
    """ 
    return sorted(set(d.keys()) | set(d.values())) 

@arg('cmd', choices=choices_for(CMD_ALIASES)) 
@arg('-r', '--randomize-order', default=False) 
@arg('-t', '--training-percent', default=0) 
def main(args): 
    args.command = CMD_ALIASES.get(args.cmd, args.cmd) 
    show(args, props=True) 

dispatch_command(main) 

這就建立了一個稍微走樣一般化機制(一個允許多個別名對於任何給定的命令)。得到的args對象具有實際給出的命令的args.cmd值和解析給定別名(如果有的話)的規範args.command值。

例如:

$ ./my_program.py dpd -r -t 80 
args: 
    cmd='dpd' 
    command='download-and-parse-data' 
    randomize_order=True 
    training_percent=80 

還有內置argh做的命令別名如果你是派遣到各個功能命令的另一個機制:@aliases裝飾,描述here。注意這種方法依賴於最近版本的​​,所以在舊的Python發行版/環境中可能不起作用。