Python:将check_call的输出连续写入文件?

17 浏览
0 Comments

Python:将check_call的输出连续写入文件?

有没有可能让以下check_call过程将stdoutstderr连续输出到一个文件中?

在我的机器上,输出只有在subprocess.check_call完成后才写入文件。

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

0
0 Comments

Python: 如何使check_call连续地输出到文件?

在不进行一些操作系统技巧的情况下是不可能做到的。

这是因为当输出是终端时,输出通常是行缓冲的(即在换行符之后,缓冲区会被刷新),但当输出是文件或管道时,它是块缓冲的,所以在块缓冲的情况下,你不会看到连续地输出,而是每1k或4k或者其他块大小写入一次。

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

缓冲的概念在http://www.gnu.org/software/libc/manual/html_node/Buffering-Concepts.html上有更好的解释。

这样做是为了提高性能(参见这个问题的回答)。

如果你可以修改子进程的代码,你可以在每一行或需要时调用flush()

否则,有外部工具可以强制行缓冲模式(通过欺骗程序以为输出是终端):

可能相关的问题:

非常好的回答! 🙂 绝对没错 🙂

0