python 多久刷新一次文件?
- 2024-12-12 08:40:00
- admin 原创
- 157
问题描述:
Python 多久刷新一次文件?
Python 多久刷新一次标准输出?
我不确定(1)。
至于 (2),我相信 Python 会在每次换行后刷新到 stdout。但是,如果你将 stdout 重载到文件,它会经常刷新吗?
解决方案 1:
对于文件操作,Python 使用操作系统的默认缓冲,除非您另行配置。您可以指定缓冲区大小、无缓冲或行缓冲。
例如,open 函数采用缓冲区大小参数。
http://docs.python.org/library/functions.html#open
“可选的缓冲参数指定文件所需的缓冲区大小:”
0 表示无缓冲,
1 表示行缓冲,
任何其他正值意味着使用(大约)该大小的缓冲区。
负缓冲意味着使用系统默认值,通常对于 tty 设备使用行缓冲,对于其他文件使用完全缓冲。
如果省略,则使用系统默认值。
代码:
bufsize = 0
f = open('file.txt', 'w', buffering=bufsize)
解决方案 2:
您还可以使用该方法以编程方式强制将缓冲区刷新到文件flush()
。
with open('out.log', 'w+') as f:
f.write('output is ')
# some work
s = 'OK.'
f.write(s)
f.write('
')
f.flush()
# some other work
f.write('done
')
f.flush()
我发现这在使用 拖尾输出文件时很有用tail -f
。
解决方案 3:
您还可以通过调用 io 模块的只读 DEFAULT_BUFFER_SIZE 属性来检查默认缓冲区大小。
import io
print (io.DEFAULT_BUFFER_SIZE)
解决方案 4:
我不知道这是否也适用于 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()
解决方案 5:
这是另一种方法,由 OP 选择他喜欢哪一种方法。
__init__
当在.py 文件中的任何其他代码之前包含以下代码时,打印的消息print
和任何错误将不再记录到 Ableton 的 Log.txt 中,而是记录到磁盘上的单独文件中:
import sys
path = "/Users/#username#"
errorLog = open(path + "/stderr.txt", "w", 1)
errorLog.write("---Starting Error Log---
")
sys.stderr = errorLog
stdoutLog = open(path + "/stdout.txt", "w", 1)
stdoutLog.write("---Starting Standard Out Log---
")
sys.stdout = stdoutLog
(对于 Mac,请更改#username#
为用户文件夹的名称。在 Windows 上,用户文件夹的路径将具有不同的格式)
当您在文本编辑器中打开文件时,如果磁盘上的文件发生变化,文本编辑器会刷新其内容(Mac 的示例:TextEdit 不会刷新,但 TextWrangler 会刷新),您将看到日志实时更新。
致谢:此代码大部分是从 Nathan Ramella 的 liveAPI 控制界面脚本中复制而来