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

2024-05-02 16:21:14 发布

您现在位置:Python中文网/ 问答频道 /正文

我正在编写一个运行虚拟终端的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之类的东西,在进程完成之前我不会收到任何输出。在按enter键之前,我也看不到我在键入什么。当bash输出单个字符时,有没有办法读取它们?在


Tags: import程序bashchild终端inputdefcreate
2条回答

问题出在别的地方。如果您打开一个交互式shell,通常会打开一个终端窗口来运行bash、sh、csh或其他任何东西。看到终端这个词了!

在过去,我们把终端连接到一个串行端口(telnet也这样做,但通过ip),同样是终端这个词。

即使是一个哑终端响应ESC代码,报告它的类型和设置光标的位置,颜色,清除屏幕等

因此,您正在使用交互式输出启动一个子进程,但是除了使用bash启动参数(如果有)之外,没有其他方法可以告诉shell和子进程是指向终端的。

我建议您启用telnetd,但只能在本地主机(127.0.0.1)上启用 在您的程序中,制作一个套接字并连接到本地主机:telnet和看看如何模拟一个合适的终端。如果一个程序处于行模式,你没问题,但如果你去全屏编辑,你将需要一个80x24或132x24的数组,或者任何你想存储其字符、颜色的数组。您还需要能够在该数组中上移行。

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

另一件好事是,如果ip连接丢失,telnet会话会清理干净,从而消除了重影进程。

马蒂金

您需要将bash正在运行的任何程序的输出更改为无缓冲,而不是行缓冲。很多程序都有一个命令行选项来实现无缓冲输出。

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

相关问题 更多 >