Python:将check_call的输出连续写入文件?
Python: 如何使check_call连续地输出到文件?
在不进行一些操作系统技巧的情况下是不可能做到的。
这是因为当输出是终端时,输出通常是行缓冲的(即在换行符之后,缓冲区会被刷新),但当输出是文件或管道时,它是块缓冲的,所以在块缓冲的情况下,你不会看到连续地输出,而是每1k或4k或者其他块大小写入一次。
这是libc的默认行为,所以如果子进程是用C编写的,并且使用printf()
/fprintf()
,它会检查输出是终端还是文件,并相应地改变缓冲模式。
缓冲的概念在http://www.gnu.org/software/libc/manual/html_node/Buffering-Concepts.html上有更好的解释。
这样做是为了提高性能(参见这个问题的回答)。
如果你可以修改子进程的代码,你可以在每一行或需要时调用flush()
。
否则,有外部工具可以强制行缓冲模式(通过欺骗程序以为输出是终端):
可能相关的问题:
- 当使用tee进行管道传输时,如何强制行缓冲(建议使用
unbuffer
) - java子进程在终止之前不会输出(我几年前写的一个简短的解释)
- 如何“即时”获取“tail -f”的输出作为输入?(建议使用
stdbuf
) - grep的管道传输与tail不起作用?(仅适用于
grep
)
非常好的回答! 🙂 绝对没错 🙂