Python:有check_call连续输出到文件?

Python: have check_call output to file continously?

是否可以得到以下check_call程序:

 logPath="log.txt"
 with open(logPath,"w") as log:
       subprocess.check_call(command, stdout = log, stderr=subprocess.STDOUT )

stdoutstderr输出到文件连续?

在我的机器上,输出仅在 subprocess.check_call finished 之后写入文件。

要实现这一点,也许我们可以修改 log 文件流的缓冲区长度?

并非没有一些 OS 技巧。

发生这种情况是因为当输出是终端时,输出通常是 行缓冲(即在换行符之后,缓冲区是 flushed),但它当输出是文件或管道时,是 block-buffered,所以在块缓冲的情况下,你不会看到写成 "continuously" 的输出,而是每 1k 或 4k 或任何块大小写入一次。

这是 libc 的默认行为,所以如果子进程是用 C 编写的并使用 printf()/fprintf(),它将检查输出是终端还是文件并更改相应的缓冲模式。

http://www.gnu.org/software/libc/manual/html_node/Buffering-Concepts.html

处(更好地)解释了缓冲的概念

这样做是出于性能原因(参见 the answer to this question)。

如果您可以修改子流程的代码,则可以在每行之后或需要时调用 flush()

否则有外部工具强制行缓冲模式(通过欺骗程序相信输出是一个终端):

可能相关:

  • Force line-buffering of stdout when piping to tee(建议使用unbuffer
  • java subprocess does not write its output until it terminates(我多年前写的简短解释)
  • How to get “instant" output of “tail -f” as input?(建议 stdbuf 用法)
  • Piping of grep is not working with tail?(仅适用于grep