15

有没有办法创建第二个终端,以便所有对curses函数的调用都在该终端上运行,而不是在现有终端中运行?当我可以交互式地尝试时,我的工作速度会更快,所以我希望能够在一个终端中运行交互式 python 解释器并在另一个终端中查看 curses 输出。

事实上,initscr()在交互式窗口中调用要么失败(PyDev),要么永久取消主机(Spyder)的窗口刷新,或者导致控制台出现奇怪的行为(IPython)。

是否可以使用 接管不同的终端setupterm()?如果是这样,我在哪里可以得到一个不同的TERM字符串来调用它?

4

3 回答 3

4

您可以使用 code.InteractiveConsole 和 SocketServer 将 python 交互式 shell 附加到套接字并通过它进行开发。一个简单的示例如下所示:

import sys
import SocketServer
from code import InteractiveConsole

class InteractiveServer(SocketServer.BaseRequestHandler):
   def handle(self):
        file = self.request.makefile(mode='rw')
        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 = "127.0.0.1", 9999

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

一旦你启动并运行它,你就可以从另一个终端连接到端口 9999 并做你的事情。您可以在此屏幕截图 (PNG)中看到此功能

使用 InteractiveConsole 的基础知识取自这篇文章。我将它修改为与我正在从事的另一个项目的 SocketServer 一起使用。

于 2011-09-02T18:50:56.503 回答
3

我不这么认为,因为 curses 模块主要(完全?)在 C 级别实现。它不太可能提供这样的钩子,但如果您熟悉该语言,则可能值得通过源代码查看。

但是,在阅读您的问题时,我想到了在其他情况下使用的另一种技术。您可以通过另一个终端/编辑器保存脚本,并使用类似于dnotify命令(甚至是简单的轮询)的技术将其加载到正在运行的程序中。

另一个想法是使用套接字发送命令并执行它们。当然,这在安全方面是危险的,因此请采取必要的预防措施。

您必须构建一些基础设施,但这可能比向 curses 添加多设备支持要容易得多。

于 2011-08-31T20:42:46.047 回答
0

好吧,我不确定我是否完全理解你想要做什么。但我所理解的是,您希望拥有一个标准的 Python 控制台,您可以在其中动态键入代码。但是当你调用例如一个函数时,这个函数的处理输出会出现在另一个终端上吗?

嗯......为了让它工作,我认为使用的架构将是一个“客户端-服务器”。

因为一个进程有一个标准输出和一个标准错误,并且在多处理架构中,您可以使用标准错误作为函数的输出管道。但问题是初始化与主终端分离的另一个终端。(在同一空间内没有重叠)。

如果您的主程序初始化一个服务器(在另一个 Python 进程上,由于服务器本身的性质),它将输出发送到连接到它的所有客户端。通过这种方式,您可以在多个终端客户端和/或另一台能够连接到您的服务器的计算机上可视化函数的输出。

在我看来,这比尝试使用“curses”包要容易得多。但是,如果唯一的目的是深入了解您的代码,我认为它过于复杂(没有附加价值)。


您仍然可以选择将函数的输出转储到文本文件 (log.txt)

于 2011-08-30T09:49:18.443 回答