繁体   English   中英

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

[英]Output from subprocess is not available on unbuffered stdout pipe before the subprocess terminates?

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

问题是尽管子p.stdout.read(1024)puts("HelloWorld")开始,但Python程序在p.stdout.read(1024)p.stdout.read(1024) 仅在子p.stdout终止后,才能在p.stdout上输出。 我认为bufsize=0意味着管道变得无缓冲,因此输出立即在管道上可用。

我已阅读以下问题,该问题指出换行符应导致输出被刷新。 但是, puts()打印换行符,因此管道不被识别为交互式设备吗?

使用sleep()时C中puts()和printf()之间的区别

这是因为puts还输出换行符,在可以确定是交互式的设备上,默认情况下会导致刷新(对于标准输出)(a)。

有任何想法吗?

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

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM