是否可以获得以下int
程序:
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
文件流的缓冲区长度?
答案 0 :(得分:3)
不是没有一些操作系统技巧。
这是因为当输出是终端时输出通常是行缓冲(即在换行符之后,缓冲区为flushed),但它是块-bffered 当输出是文件或管道时,所以在块缓冲的情况下,你不会看到输出写的"连续",而是每1k写一次或4k或任何块大小。
这是libc的默认行为,因此如果子进程是用C语言编写并使用printf()
/ fprintf()
,它将检查输出,如果它是终端或文件并更改缓冲相应的模式。
http://www.gnu.org/software/libc/manual/html_node/Buffering-Concepts.html
解释了(更好)缓冲的概念这是出于性能原因(参见the answer to this question)。
如果你可以修改子进程'代码,您可以在每行之后或需要时拨打flush()
。
否则有外部工具强制行缓冲模式(通过诱使程序相信输出是终端):
可能相关:
unbuffer
)stdbuf
用法)grep
)