2011-08-26 109 views
12

有沒有辦法創建第二個終端,以便所有對curses功能的調用都可以在該終端上運行,而不是在現有終端上運行?當我可以交互式地嘗試時,我的工作速度更快,所以我希望能夠在一個終端中運行交互式Python解釋器,並在另一個終端中看到curses輸出。有沒有一種交互式編程Python curses應用程序的方法?

事實上,在交互式窗口中調用initscr()要麼失敗(PyDev),要麼永久地從主機(Spyder)中取消窗口刷新或在控制檯(IPython)中導致奇怪的行爲。

是否有可能使用setupterm()接管不同的終端?如果是這樣,我在哪裏得到不同的TERM字符串來調用它?

回答

3

的選擇,我不相信這樣的詛咒模塊主要是在C實現的(全?)水平。它不可能提供這樣的鉤子,但如果你熟悉這種語言,它可能值得通過源代碼來查找。

然而,在閱讀你的問題時,我想到了另一種我在其他環境中使用的技術。您可以通過另一個終端/編輯器保存腳本,並使用類似於dnotify命令(甚至簡單的輪詢)的技術將其加載到正在運行的程序中。

另一個想法是使用套接字發送命令並執行它們。當然這在安全方面是危險的,所以要採取必要的預防措施。

您必須構建一些基礎架構,但它可能比向curses添加多個設備支持要容易得多。

1

嗯,我不知道我完全理解你想要做什麼。但我已經理解的是,你想有一個標準的Python控制檯,你可以動態地鍵入你的代碼。但是當你打電話時,例如一個函數,這個函數的處理輸出會出現在另一個終端上?

那麼......因爲它的工作,我認爲使用的架構將是一個「客戶端 - 服務器」。

因爲一個進程有一個stdout和一個stderr,並且在多處理架構中,你可以使用stderr作爲函數的輸出管道。但是問題在於初始化與主要終端分離的另一個終端。 (在同一空間內不重疊)。

如果您的主程序初始化一個服務器(在另一個Python進程上,由於服務器本身的性質),它將輸出發送到連接到它的所有客戶端。通過這種方式,您可以在多個終端客戶端和/或另一臺能夠連接到服務器的計算機上可視化該功能的輸出。

在我看來,它比嘗試使用'curses'包容易得多。 但是,如果唯一的目的是獲得您的代碼的洞察力,我認爲它過於複雜(沒有附加價值)。


,你還有這個函數的輸出傾倒到一個文本文件(log.txt的)

3

您可以使用code.InteractiveConsole和SocketServer將python交互式shell附加到套接字上,並通過該套件進行開發。一個簡單的例子是這樣的:

import sys 
import SocketServer 
from code import InteractiveConsole 

class InteractiveServer(SocketServer.BaseRequestHandler): 
    def handle(self): 
     file = self.request.makefile() 
     shell = Shell(file) 
     try: 
      shell.interact() 
     except SystemExit: 
      pass 


class Shell(InteractiveConsole): 
    def __init__(self, file): 
     self.file = sys.stdout = file 
     InteractiveConsole.__init__(self) 
     return 

    def write(self, data): 
     self.file.write(data) 
     self.file.flush() 

    def raw_input(self, prompt=""): 
     self.write(prompt) 
     return self.file.readline() 

if __name__ == '__main__': 
    HOST, PORT = "0.0.0.0", 9999 

    server = SocketServer.TCPServer((HOST, PORT), InteractiveServer) 
    server.serve_forever() 

一旦你得到了建立和運行,你可以從另一端連接到端口9999,並做你的事。你可以看到這個工作在this screenshot (PNG)

使用InteractiveConsole的基礎知識採取了from this post。我將其修改爲與我正在處理的另一個項目的SocketServer一起使用。

相關問題