2011-08-26 85 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一起使用。

相关问题