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 )
将stdout
和stderr
输出到文件连续?
在我的机器上,输出仅在 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
)
是否可以得到以下check_call
程序:
logPath="log.txt"
with open(logPath,"w") as log:
subprocess.check_call(command, stdout = log, stderr=subprocess.STDOUT )
将stdout
和stderr
输出到文件连续?
在我的机器上,输出仅在 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
)