如何从Python实时读取终端输出?

时间:2011-11-29 18:31:32

标签: python multithreading bash

我正在编写一个运行虚拟终端的Python程序。目前我正在推出它:

import pexpect, thread

def create_input(child, scrollers, textlength=80, height=12):
    while 1:
        newtext = child.readline()
        print newtext

child = pexpect.spawn("bash", timeout=30000)

thread.start_new_thread(create_input,(child))

这很有效,我可以通过child.send(command)向它发送命令。但是,我只获得整行作为输出。这意味着如果我启动像Nano或Links这样的东西,在完成该过程之前我不会收到任何输出。在我按下回车之前,我也无法看到我正在输入的内容。有没有办法在bash输出时读取单个字符?

2 个答案:

答案 0 :(得分:2)

您需要将正在运行的程序bash的输出更改为无缓冲而不是行缓冲。大量程序具有无缓冲输出的命令行选项。

expect项目有一个名为unbuffer的工具,看起来它可以为你提供所有无缓冲的bash输出。我个人从来没有使用它,但是在这里还有其他答案也推荐它:bash: force exec'd process to have unbuffered stdout

答案 1 :(得分:1)

问题在于其他问题。如果你打开一个交互式shell,通常会打开一个运行bash,sh,csh等的终端窗口。看到终端这个词!

在过去,我们将一个终端连接到一个串口(telnet做同样但是通过ip),再次单词terminal。

即使是一个哑终端也会响应ESC代码,报告其类型并设置光标位置,颜色,清晰屏幕等。

所以你正在开始一个带有交互式输出的子进程,但除了bash启动参数(如果有的话)之外,没有办法告诉shell和子进程是否在这个设置中的终端。

我建议你启用telnetd,但只能在localhost(127.0.0.1)上启用 在你的程序中,创建一个套接字并连接到localhost:telnet并查找如何模拟正确的终端。如果一个程序处于行模式你就可以了,但是如果你进行全屏编辑,你需要一个80x24或132x24的数组,或者你想要存储其字符颜色的任何大小。您还需要能够在该阵列中移动线。

我没看过,但我无法想象python中没有telnet客户端示例,终端emu也必须在那里!

另一件好事是,如果ip连接丢失,telnet会话将被清除,从而消除了ghost进程。

马亭