使用Python强制另一个程序的标准输出无缓冲

grr*_*sel 13 python linux stdout pipe

python脚本控制Linux上的外部应用程序,通过管道将输入传递到外部应用程序stdin,并通过外部应用程序stdout的管道读取输出.

问题是对管道的写入是按块而不是按行缓冲的,因此在控制脚本通过外部应用程序中的printf接收数据输出之前会发生延迟.

无法更改外部应用程序以添加显式fflush(0)调用.

如何将python标准库的pty模块与子进程模块一起使用来实现这一目标?

caf*_*caf 6

您可以使用PTY来解决此问题:

  • 创建一个pty主/从对;
  • 将子进程的stdin,stdout和stderr连接到pty slave设备;
  • 在父母中读取和写入pty主人.


Wil*_*ell 5

这样做是可能的,但我能想到的唯一解决方案是相当复杂,不可移植,并且可能充满了有问题的细节.您可以使用LD_PRELOAD使外部应用程序加载动态库,该库包含一个调用setvbuf到unbuffer stdout的构造函数.您可能还希望在库中包装setvbuf以防止应用程序显式缓冲其自己的stdout.并且你想要包装fwrite和printf,以便它们在每次调用时刷新.编写要预加载的.so会将你带到python之外.


Jon*_*San -1

尝试使用 -u 参数运行 Python 解释器:

python -u myscript.py
Run Code Online (Sandbox Code Playgroud)

这会强制 Python 使用无缓冲的 stdin/stdout,这可能会对您有所帮助。