我使用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操作实际上已经完成。