- Python 多久刷新一次文件?
- Python 多久刷新一次标准输出?
(1) 我不确定。
(2) 对于 Python,我认为它在每个新行后都会刷新标准输出。但是,如果你将标准输出重定向到文件,它是否会刷新得更频繁呢?
Python在进行文件操作时,默认使用操作系统的缓冲方式,除非您进行配置。您可以指定缓冲区大小、无缓冲或行缓冲。
例如,open函数接受一个缓冲区大小参数。
http://docs.python.org/library/functions.html#open
"可选的缓冲区参数用于指定文件所需的缓冲区大小:"
代码:
bufsize = 0
f = open('file.txt', 'w', buffering=bufsize)
你还可以通过编程的方式使用flush()
方法强制将缓冲区刷新到文件中。
with open('out.log', 'w+') as f:
f.write('output is ')
# some work
s = 'OK.'
f.write(s)
f.write('\n')
f.flush()
# some other work
f.write('done\n')
f.flush()
当使用 tail -f
跟踪输出文件时,我发现这很有用。
你还可以通过从 io 模块调用只读的 DEFAULT_BUFFER_SIZE 属性来检查默认缓冲区大小。
import io
print (io.DEFAULT_BUFFER_SIZE)
我不确定这是否也适用于Python,但我认为它取决于您运行的操作系统。
例如,在Linux上,终端输出在换行符时会刷新缓冲区,而对于文件输出,则只有在缓冲区已满时才会刷新(默认情况下)。 这是因为刷新缓冲区的次数越少越高效,并且如果在文件中未在换行符上刷新输出,用户可能不太容易注意到。
如果需要,您可能能够自动刷新输出。
编辑:我认为您可以按照此方式(基于此处)在Python中进行自动刷新。
#0 means there is no buffer, so all output
#will be auto-flushed
fsock = open('out.log', 'w', 0)
sys.stdout = fsock
#do whatever
fsock.close()
import sys
path = "/Users/#username#"
errorLog = open(path + "/stderr.txt", "w", 1)
errorLog.write("---Starting Error Log---\n")
sys.stderr = errorLog
stdoutLog = open(path + "/stdout.txt", "w", 1)
stdoutLog.write("---Starting Standard Out Log---\n")
sys.stdout = stdoutLog
#username#
更改为您的用户文件夹名称。在Windows上,您的用户文件夹路径格式将不同)
open('file.txt', 'w', 1)
时,我得到了正确的行缓冲。但是如果我使用更大的值(我想用open('file.txt', 'w', 512)
),它会缓冲完整的8192字节的io.DEFAULT_BUFFER_SIZE
。这是Python的bug、Linux的bug还是ID10t的bug? - Bruno Bronoskystdout
以行缓冲的方式工作,无论它是在控制台还是被重定向到文件中。 - Mikhail T.write()
函数时,输出会被缓存到内存中并累积,直到缓存已满...此时缓存将被 "flushed"(即将内容从缓存写入文件)。您可以通过在文件句柄上调用flush()
方法来显式刷新缓存。 - Corey Goldberg