Answers:
对于文件操作,Python使用操作系统的默认缓冲,除非您对其进行配置,否则进行配置。您可以指定缓冲区大小,无缓冲或行缓冲。
例如,open函数采用缓冲区大小参数。
http://docs.python.org/library/functions.html#open
“可选的缓冲参数指定文件的所需缓冲区大小:”
码:
bufsize = 0
f = open('file.txt', 'w', buffering=bufsize)
open('file.txt', 'w', 1)
我可以获得适当的行缓冲。但是,如果我做更大的事情(我想要open('file.txt', 'w', 512)
),它将缓冲io.DEFAULT_BUFFER_SIZE
8192 的全部内容。这是Python错误,Linux错误还是ID10t错误?
stdout
无论是控制台还是重定向到文件,我都想进行行缓冲?
write()
文件句柄时,输出缓冲在内存中并累积直到缓冲区已满...这时缓冲区被“清除”(内容从缓冲区写入文件)。您可以通过flush()
在文件句柄上调用方法来显式刷新缓冲区。
您也可以使用该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
。
Note: flush() does not necessarily write the file’s data to disk. Use flush() followed by os.fsync() to ensure this behavior.
Note: flush() does not necessarily write the file’s data to disk. Use flush() followed by os.fsync() to ensure this behavior.
flushing
含义。我们为什么需要它?这是为了什么 我为什么要关心它?
我不知道这是否也适用于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()
这是另一种方法,由OP来选择他更喜欢哪个。
如果将以下代码包含在__init__
.py文件中,然后再包含其他任何代码,则打印有消息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控制界面脚本复制的