【问题标题】:Output from subprocess is not available on unbuffered stdout pipe before the subprocess terminates?在子进程终止之前,子进程的输出在无缓冲的标准输出管道上不可用?
【发布时间】:2018-12-15 20:25:33
【问题描述】:

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

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

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

Difference between puts() and printf() in C while using sleep()

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

有什么想法吗?

【问题讨论】:

  • 您是否尝试过在 C 程序中的每个 puts 之后进行刷新?

标签: python python-3.x subprocess


【解决方案1】:

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

【讨论】:

  • 谢谢。但是为什么 C 程序在从 shell 执行时会按预期工作?在这里,一切都得到了应有的输出,即 puts() 出现在 scanf() 等之前。我不明白为什么我看不到管道的这种行为。
猜你喜欢
  • 1970-01-01
  • 2020-08-18
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2012-03-13
  • 2010-12-10
  • 1970-01-01
相关资源
最近更新 更多