Python脚本被控制在Linux的外部应用程序,通过配管在输入传递给外部应用程序标准输入,和经由管道从所述外部应用程序的stdout读取输出。
的问题是,写入管道由块缓冲,而不是通过线,并且因此该控制脚本通过接收之前数据输出,例如,在printf的外部应用程序发生的延迟。
外部应用程序不能改变增加明确的fflush(0)调用。
如何才能PTY Python标准库的模块与使用子模块来实现这一目标?
Python脚本被控制在Linux的外部应用程序,通过配管在输入传递给外部应用程序标准输入,和经由管道从所述外部应用程序的stdout读取输出。
的问题是,写入管道由块缓冲,而不是通过线,并且因此该控制脚本通过接收之前数据输出,例如,在printf的外部应用程序发生的延迟。
外部应用程序不能改变增加明确的fflush(0)调用。
如何才能PTY Python标准库的模块与使用子模块来实现这一目标?
您可以使用的pty通过解决这个:
这样做是可能的,但我能想到的唯一的解决办法是相当令人费解,不便于携带,而且很可能有问题的细节充满。 您可以使用LD_PRELOAD导致外部应用程序加载其中包含了调用setvbuf用来给非缓冲标准输出构造一个动态库。 你可能也想包装调用setvbuf在图书馆防止应用程序明确缓冲自己的标准输出。 你会想包装的fwrite和printf,使他们在每次调用刷新。 写的。所以要预装将带您蟒蛇之外。
我不认为这是可能的。 如果源应用程序不刷新其传出缓冲器,数据将不是进程之外,直到缓冲器溢出和冲洗被强制达到。
请注意,如完善的命令是如何的文件 ,导致它明确地刷新其输出的选项(-n)。 这在其中它从管道读取输入的文件名,并打印所检测到的类型的模式中使用的文件时需要。 由于在此模式下,该文件的程序不会做的时候退出,否则将不会出现在输出。
在较低水平考虑这样的:输出缓冲仅仅意味着做write()
上的缓冲流拷贝数据到内存中的缓冲液,直到缓冲区已满或(典型地),直到换行中找到。 然后,缓冲器可达上溢或换行的部分被写入write()
n至底层系统级文件描述符(这可能是一个文件,管道,套接字,...)。
我不知道你将如何说服程序刷新其缓冲区,从外面。
它值得注意的是,当他们认为它不会给一个“真正的用户”一些程序只缓冲他们的输出(即,一个tty)。 当他们发现自己的输出正被另一个程序读取,它们缓冲。
一个tty的仿真是的事情之一预计不会在其他自动化进程。
有一种期待的纯Python实现 ,但我不知道它如何妥善处理tty的仿真。
在回答这个问题可能会有所帮助:
Python的运行守护子进程和阅读的stdout
似乎是解决相同的问题。
这个问题是有点老了,但我觉得你的问题,现在可以通过使用子打电话来解决stdbuf您要执行的是命令。
尝试运行Python解释器,用-u参数:
python -u myscript.py
这迫使Python中使用无缓冲标准输入/输出可以帮助你。