260
  1. Python多久刷新一次文件?
  2. Python多久刷新一次标准输出?

我不确定(1)。

至于(2),我相信 Python 在每一行之后都会刷新到标准输出。但是,如果您将 stdout 重载到文件中,它是否会经常刷新?

4

5 回答 5

379

对于文件操作,Python 使用操作系统的默认缓冲,除非您另外配置。您可以指定缓冲区大小、无缓冲或行缓冲。

例如,open 函数采用缓冲区大小参数。

http://docs.python.org/library/functions.html#open

“可选的缓冲参数指定文件所需的缓冲区大小:”

  • 0 表示无缓冲,
  • 1 表示行缓冲,
  • 任何其他正值意味着使用(大约)该大小的缓冲区。
  • 负缓冲意味着使用系统默认值,通常对 tty 设备进行行缓冲,对其他文件进行完全缓冲。
  • 如果省略,则使用系统默认值。

代码:

bufsize = 0
f = open('file.txt', 'w', buffering=bufsize)
于 2010-07-02T19:02:27.103 回答
194

您还可以使用该方法以编程方式强制将缓冲区刷新到文件中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.

于 2011-03-10T05:13:15.437 回答
14

我不知道这是否也适用于 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()
于 2010-07-02T16:37:16.757 回答
13

您还可以通过调用 io 模块中的只读 DEFAULT_BUFFER_SIZE 属性来检查默认缓冲区大小。

import io
print (io.DEFAULT_BUFFER_SIZE)
于 2016-05-20T15:28:11.157 回答
2

这是另一种方法,由 OP 选择他喜欢的方法。

当在 .py 文件中包含以下代码__init__之前的任何其他代码时,打印的消息print和任何错误将不再记录到 Ableton 的 Log.txt,而是记录到磁盘上的单独文件中:

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

(对于 Mac,更改#username#为您的用户文件夹的名称。在 Windows 上,您的用户文件夹的路径将具有不同的格式)

当您在文本编辑器中打开文件时,当磁盘上的文件更改时会刷新其内容(例如 Mac:TextEdit 没有,但 TextWrangler 有),您将看到实时更新的日志。

致谢:这段代码主要是从 Nathan Ramella 的 liveAPI 控制界面脚本中复制而来的

于 2016-07-29T09:09:07.363 回答