创建新终端/命令行窗口仅显示文本
我想把几个子进程的输出(有时候是串联的,有时候是并行的)实时显示到一个终端窗口里,这个窗口不是我正在用的Python shell(无论是IDE、命令行,还是用tkinter运行的脚本)。IPython不行。我需要一个标准安装就能用的东西。最好是操作系统无关的解决方案,但需要在XP和Vista上能用。
如果你想知道我已经尝试过什么,我可以分享,但我觉得有点尴尬。
3 个回答
你可以创建一个生产者-消费者系统,通过网络插入数据(其实没什么复杂的)。消费者会是一个多线程的socket服务器,它会监听连接并把所有数据放进一个队列里。在一个单独的线程中,它会从队列中取出数据并在控制台上打印出来。这个程序可以在命令行窗口或者Eclipse的控制台中作为外部工具运行,操作起来也不麻烦。
从你的角度来看,这个系统应该是实时的。作为额外的好处,你可以把生产者和消费者放在不同的机器上,生产者甚至可以组成一个网络。
关于Python的socket编程示例,你可以在这里找到。想看一个TCP回声服务器的例子,可以去这里,而TCP的“你好,世界”socket客户端的例子在这里。
Windows上还有一个扩展,可以使用命名管道。
在Linux(可能是Cygwin?)上,你可以直接用tail -f named-fifo来查看数据。
祝你好运!
你提到“管道”,所以我猜你是在处理子进程的文本输出。一个简单的解决办法就是直接把输出写入文件吗?
比如在子进程中:
- 把输出重定向到
%TEMP%\output.txt
这个文件。 - 在退出时,把
output.txt
复制到一个你主进程正在监视的目录里。
在主进程中:
- 每秒检查一次那个目录,看有没有新文件。
- 找到文件后,处理它们并删除。
你可以在输出文件名中编码子进程的名称,这样你就知道该怎么处理这些文件了。
在Unix系统中,一个不错的解决方案是命名管道。我知道你问的是Windows,但在Windows中可能也有类似的方法,或者这对其他人可能会有帮助。
在终端1上:
mkfifo /tmp/display_data
myapp >> /tmp/display_data
在终端2(bash)上:
tail -f /tmp/display_data
编辑: 把终端2的命令改成使用“tail -f”,而不是无限循环。