2011-01-09 50 views
2

我想開發一個命令行程序,它可以處理子命令並給予「幫助」。具體來說,假設我有一個叫做「cgent」的腳本,我想讓子命令「abc」,「def」和「xyz」執行並接受sys.args的其餘部分,以便通過optparse進行處理。在python中爲命令行程序自動註冊「命令」

 
cgent abc [options] 
cgent help abc 
.... 

所有這一切都很簡單,如果我硬編碼的子命令名稱。但是,我希望能夠通過添加類或模塊(?)繼續添加子命令。例如,這與Web框架用於添加控制器的想法類似。我嘗試過通過塔架挖掘,看看我是否可以重新創建那裏所做的,但我沒有解開邏輯。有關如何做到這一點的任何建議?

感謝, 肖恩

回答

1

你必須創建一個 「命令,註冊表」。這可以像字典一樣簡單。

在你做的主要程序:

commands = {} 

在任何子模塊,添加你做

from yourmodule.main import commands 

def mynewcommand(arguments=here): 
    pass 

commands['newcommand'] = mynewcommand 

然後你可以使用argparse處理的命令。在這種情況下,你的模塊也需要爲命令添加subparser部分。

3

如果您不需要對參數進行復雜的解析,我推薦使用baker模塊。它允許您通過裝飾器定義子命令及其參數。例如:

#!/usr/bin/env python 
import baker 

@baker.command() 
def foo(a=1): 
    print 'foo:', a 

@baker.command() 
def baz(b=1): 
    print 'baz:', b 

baker.run() 

定義了這兩個子命令foobaz,與(可選)參數ab。 所以,你可以使用它們像這樣:

$ ./test_baker.py foo --a 2 
foo: 2 
$ ./test_baker.py baz 
baz: 1 

它還使用文檔字符串來產生幫助。

由於baker模塊是全局模塊,因此您的子命令可以跨越多個.py文件。只要它們被導入,子命令就會自動註冊。

此外,它只是一個.py文件,因此您可以將其放在源代碼樹中。