在子流程终止之前,子流程的输出在未缓冲的stdout管道上不可用



我使用subprocess.Popen(['myapp'], stdin=PIPE, stdout=PIPE, stderr=PIPE, bufsize=0)创建了一个子流程,该流程执行一个C程序,该程序使用例如puts()写入stdout

问题是Python程序在p.stdout.read(1024)中阻塞,尽管子进程从puts("HelloWorld")开始。只有在子流程终止后,p.stdout上才有可用的输出。我认为bufsize=0意味着管道变得没有缓冲区,这样管道上就可以立即获得输出。

我已经阅读了下面的问题,其中指出换行应该导致输出被刷新。然而,puts()打印了一条换行符,那么管道是否未被识别为交互式设备?

使用sleep((时C中puts((和printf((之间的差异

这是因为put还输出一个换行符,在可以确定为交互式的设备,通过默认值(用于标准输出((a(。

有什么想法吗?

这是应用程序的行为。即使管道没有缓冲,应用程序通常会在实际写入文件(任何类型的文件(之前缓冲一段时间。正如Jon在上面的评论所指出的,程序可以使用类似fflush()的系统调用来确保它们实际上已经发布了数据,如果适用,物理I/O操作实际上已经完成。

相关内容

  • 没有找到相关文章

最新更新