有没有办法创建第二个终端,以便所有对curses
函数的调用都在那个上运行,而不是在现有的终端上运行?当我可以以交互方式尝试时,我工作得更快,所以我希望能够在一个终端中运行交互式python解释器,并在另一个终端中查看curses输出。
实际上,在交互式窗口中调用initscr()
失败(PyDev)或永久地从主机(Spyder)中取消窗口刷新或在控制台中引起奇怪的行为(IPython)。
是否可以使用setupterm()
接管不同的终端?如果是这样,我在哪里可以使用不同的TERM
字符串来调用它?
答案 0 :(得分:3)
我不相信,因为curses模块主要(完全?)在C级实现。它不太可能提供这样的钩子,尽管如果你熟悉这种语言,它可能值得通过源头查看。
然而,在阅读你的问题时,我想到了我在其他环境中使用的另一种技术。您可以通过另一个终端/编辑器保存脚本,并使用类似于dnotify命令(甚至简单轮询)的技术将其加载到正在运行的程序中。
另一个想法是使用套接字发送命令并执行它们。当然这在安全方面是危险的,所以采取必要的预防措施。
您必须构建一些基础架构,但它可能比向curses添加多个设备支持要容易得多。
答案 1 :(得分: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来处理我正在处理的另一个项目。
答案 2 :(得分:1)
好吧,我不确定我完全理解你要做的事情。但我所理解的是,您希望拥有一个标准的python控制台,您可以在其中动态键入代码。但是当你调用时,例如,函数处理的输出会出现在另一个终端中吗?
嗯...为了工作,我认为使用的架构将是“客户端 - 服务器”。
因为进程具有stdout和stderr,并且在多处理体系结构中,您可以使用stderr作为函数的输出管道。但问题是初始化与主要终端分离的另一个终端。 (在同一空间内没有重叠)。
如果您的主程序初始化服务器(在另一个Python进程上,因为服务器的性质本身)将输出发送到连接到它的所有客户端。这样,您可以在多个终端客户端和/或另一台能够连接到服务器的计算机上可视化功能的输出。
在我看来,这比尝试使用'curses'包容易得多。 但如果唯一的目的是获得对代码的洞察力,我认为它过于复杂(没有附加价值)。
您仍然可以选择将函数的输出转储到文本文件(log.txt)