强制另一个程序的标准输出使用Python中无缓冲(Force another program'

2019-07-21 17:33发布

Python脚本被控制在Linux的外部应用程序,通过配管在输入传递给外部应用程序标准输入,和经由管道从所述外部应用程序的stdout读取输出。

的问题是,写入管道由块缓冲,而不是通过线,并且因此该控制脚本通过接收之前数据输出,例如,在printf的外部应用程序发生的延迟。

外部应用程序不能改变增加明确的fflush(0)调用。

如何才能PTY Python标准库的模块与使用子模块来实现这一目标?

Answer 1:

您可以使用的pty通过解决这个:

  • 创建PTY主/从对;
  • 连接子进程的标准输入,输出和错误的pty从属设备;
  • 读取和写入到父pty主。


Answer 2:

这样做是可能的,但我能想到的唯一的解决办法是相当令人费解,不便于携带,而且很可能有问题的细节充满。 您可以使用LD_PRELOAD导致外部应用程序加载其中包含了调用setvbuf用来给非缓冲标准输出构造一个动态库。 你可能也想包装调用setvbuf在图书馆防止应用程序明确缓冲自己的标准输出。 你会想包装的fwrite和printf,使他们在每次调用刷新。 写的。所以要预装将带您蟒蛇之外。



Answer 3:

我不认为这是可能的。 如果源应用程序不刷新其传出缓冲器,数据将不是进程之外,直到缓冲器溢出和冲洗被强制达到。

请注意,如完善的命令是如何的文件 ,导致它明确地刷新其输出的选项(-n)。 这在其中它从管道读取输入的文件名,并打印所检测到的类型的模式中使用的文件时需要。 由于在此模式下,该文件的程序不会做的时候退出,否则将不会出现在输出。

在较低水平考虑这样的:输出缓冲仅仅意味着做write()上的缓冲流拷贝数据到内存中的缓冲液,直到缓冲区已满或(典型地),直到换行中找到。 然后,缓冲器可达上溢或换行的部分被写入write() n至底层系统级文件描述符(这可能是一个文件,管道,套接字,...)。

我不知道你将如何说服程序刷新其缓冲区,从外面。



Answer 4:

它值得注意的是,当他们认为它不会给一个“真正的用户”一些程序只缓冲他们的输出(即,一个tty)。 当他们发现自己的输出正被另一个程序读取,它们缓冲。

一个tty的仿真是的事情之一预计不会在其他自动化进程。

有一种期待的纯Python实现 ,但我不知道它如何妥善处理tty的仿真。



Answer 5:

在回答这个问题可能会有所帮助:

Python的运行守护子进程和阅读的stdout

似乎是解决相同的问题。



Answer 6:

这个问题是有点老了,但我觉得你的问题,现在可以通过使用子打电话来解决stdbuf您要执行的是命令。



Answer 7:

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

python -u myscript.py

这迫使Python中使用无缓冲标准输入/输出可以帮助你。



文章来源: Force another program's standard output to be unbuffered using Python