有没有一种交互式编程Python curses应用程序的方法?

15
有没有办法创建第二个终端来操作所有 curses 函数,而不是在现有终端中操作呢?我在交互模式下尝试东西时能更快地工作,因此我想能够在一个终端中运行交互式 Python 解释器并在另一个终端中查看 curses 输出。
目前的情况是,在交互窗口中调用 initscr() 要么失败(PyDev),要么永久性地从主机中取走窗口刷新(Spyder),要么导致控制台出现奇怪的行为(IPython)。
使用 setupterm() 能否接管其他终端?如果可以,我该从哪里获取不同的 TERM 字符串以调用它?
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配合使用。

截图已经消失 - Robert Siemer

3
我不这么认为,因为curses模块大多数(完全?)是在C层实现的。 它不太可能提供这样的钩子,尽管如果您熟悉该语言,可以值得查看源代码。
然而,在阅读您的问题时,我想到了另一种我在其他上下文中使用的技术。您可以通过另一个终端/编辑器保存脚本,并使用类似于dnotify命令(甚至是简单轮询)的技术将其加载到正在运行的程序中。
另一个想法是使用套接字发送命令并执行它们。 当然,从安全角度来看,这很危险,因此请采取必要的预防措施。
您将不得不构建一些基础设施,但这可能比向curses添加多个设备支持要容易得多。

0

嗯,我不确定我完全理解你想做什么。但是我所理解的是,你想要一个标准的 Python 控制台,可以动态地输入代码。但是当你调用例如函数时,该函数处理的输出将出现在另一个终端上?

好吧...为了使它工作,我认为要使用的架构应该是“客户端-服务器”。

因为进程具有 stdout 和 stderr,在多进程架构中,您可以使用 stderr 作为函数输出管道。但问题在于初始化与主要终端分离的其他终端(没有在同一空间内重叠)。

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

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


你仍然可以将函数的输出转储到文本文件(log.txt)中。


网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接