使用python的cmd.Cmd創建自定義CLI時,如何告訴處理程序中止當前行並給我一個新提示?更好地處理cmd.Cmd命令行解釋器中的KeyboardInterrupt
這裏是一個小例子:
# console_min.py
# run: 'python console_min.py'
import cmd, signal
class Console(cmd.Cmd):
def __init__(self):
cmd.Cmd.__init__(self)
self.prompt = "[test] "
signal.signal(signal.SIGINT, handler)
def do_exit(self, args):
return -1
def do_EOF(self, args):
return self.do_exit(args)
def preloop(self):
cmd.Cmd.preloop(self)
self._hist = []
self._locals = {}
self._globals = {}
def postloop(self):
cmd.Cmd.postloop(self)
print "Exiting ..."
def precmd(self, line):
self._hist += [ line.strip() ]
return line
def postcmd(self, stop, line):
return stop
def emptyline(self):
return cmd.Cmd.emptyline(self)
def handler(self, signum, frame):
# self.emptyline() does not work here
# return cmd.Cmd.emptyline(self) does not work here
print "caught ctrl+c, press return to continue"
if __name__ == '__main__':
console = Console()
console.cmdloop()
此外幫助感激。
原始的問題和更多的細節: [目前下面的建議已被納入了這個問題 - 仍在尋找答案。更新修復的錯誤。]
因爲我已經試過處理程序移動到功能外循環,看它是否是更靈活,但它不會出現如此。
我使用python的cmd.Cmd module創建自己的命令行解釋器來管理一些軟件的交互。我經常按ctrl + c,期望流行的類似shell的行爲返回一個新的提示,而不用處理任何鍵入的命令。但是,它只是退出。我試圖在代碼中的各個點(preloop等)捕獲KeyboardInterrupt異常無濟於事。我讀過sigints,但不太清楚這是否適合這裏。
UPDATE:從下面的建議,我試圖執行信號,並能做到這樣CTRL + C,現在不退出CLI但並打印信息。然而,我的新問題是,我似乎無法告訴處理函數(見下文)在印刷旁邊做很多事情。我想ctrl + c基本上中止當前行,並給我一個新的提示。
這*看起來似乎在融合在一個解決方案上,但我不知道如何將它集成到我自己的代碼中(上圖)。我必須弄清楚'超級'線。我需要嘗試在將來的某個時刻使這項工作順利進行。 – 2012-12-05 16:31:57
在Python 2.x中,'cmd.Cmd'是一個*舊式class *,所以'super'不起作用。看[這個問題](http://stackoverflow.com/questions/770134)。 – 2015-12-11 18:19:39
爲什麼你必須自己調用'postloop()'? – 2015-12-11 18:37:26