2012-07-16 60 views
2

我被要求用Python模擬CLI。使用python模擬CLI Shell

這是我做過什麼

def somefunction(a,b): 
    //codes here 
//consider some other functions too 

print "--- StackOverFlow Shell ---" 
while True: 
    user_input = raw_input("#> ") 
    splitit = user_input.split(" ") 
    if splitit[0] == "add": 
     firstNum = splitit[1] 
     sNum = splitit[2] 
     result = somefunction(firstNum, sNum) 
     print result 
    //consider some other elif blocks with "sub", "div", etc 
    else: 
     print "Invalid Command" 

我還檢查列表的長度,這裏的「splitit」我將只允許3變元的,首先將是操作,以及第二和第三個參數有一些功能要執行,如果參數超過3,因爲我確實要進行檢查。

雖然不知何故我設法使它工作,但有沒有更好的方法來實現相同?

+0

如果是更比一些10的命令,你會很快得到每個命令陷入困境,如果你分析和邏輯調配自己的語法shell會變得難以維護,」 」。將它分解爲標記器,解析器(帶有一些命令數據庫)和解釋器(執行單元),這是一個管道,原始輸入在執行前通過這些步驟,而不是對每個命令重複執行相同的步驟。 – 2012-07-16 07:19:12

+0

是的對於2-3個函數,我很好......但我被要求在初始化時不要傳遞參數。 like myProgram.py <<不允許 我的老師說的和你說的一樣,因爲2-3的命令是好的,但是對於一個巨大的程序來說,它將變得無法維護,我完全無奈......並且不知道如何做到這一點,考慮提示是一個定製的。 – Whiskey 2012-07-16 07:28:26

回答

10

使用Python CMD模塊:在下面的網頁給出

檢查幾個例子爲面向行的命令解釋

http://www.doughellmann.com/PyMOTW/cmd

http://docs.python.org/library/cmd.html#支持 - #創建面向行的​​命令處理器

prompt可以設置爲每次要求用戶輸入新命令時要打印的字符串。

intro是在程序開始時打印的「歡迎」信息。

如:

import cmd 

class HelloWorld(cmd.Cmd): 
    """Simple command processor example.""" 

    prompt = 'prompt: ' 
    intro = "Simple command processor example." 
+0

事實上,我檢查檢查,這是好的,但不知何故我無法設法修改提示。 cmd模塊會給出類似於(cmd)的提示,如果按照我的需要(比如「#>」或「StackOverFlow〜#」)提示可以自定義,那麼我對它很滿意,你能幫我嗎? – Whiskey 2012-07-16 07:23:50

+1

更新了答案請檢查 – avasal 2012-07-16 07:25:34

+0

謝謝,我想這是我的老師正在尋找的。公認! – Whiskey 2012-07-16 07:30:15

1

你應該檢查出的VTE的lib:

http://earobinson.wordpress.com/2007/09/10/python-vteterminal-example/

它的作品真的很好,你可以非常輕鬆地定製它的外觀。這是多麼簡單:

# make terminal 
    terminal = vte.Terminal() 
    terminal.connect ("child-exited", lambda term: gtk.main_quit()) 
    terminal.fork_command() 

    # put the terminal in a scrollable window 
    terminal_window = gtk.ScrolledWindow() 
    terminal_window.set_policy(gtk.POLICY_AUTOMATIC, gtk.POLICY_AUTOMATIC) 
    terminal_window.add(terminal) 
+0

感謝您的迴應...雖然我的老師想要cmd模塊,但是vte吸引了我,也許我可以讓她驚訝於VTE lib :) – Whiskey 2012-07-17 07:56:06

+0

可以請投票嗎? – Fabrizio 2012-07-18 13:23:28