我正在不断地写入一个文件,我想从另一个 shell 中跟踪它。但似乎只要打开文件进行写入,
tail -f filename
在文件再次关闭之前无法显示所有新行。
不幸的是,每秒多次打开和关闭文件会使我的脚本减慢到接收数据的速度快于写入数据的速度,因此我无法在此过程中关闭文件。
写作是由一个python程序完成的:
ser = serial.Serial('/dev/ttyACM2',9600)
f = open("filename", "a+")
while True:
s = ser.readline()
f.write(s + "\r\n")
没有办法查看正在写入的文件的内容吗?
如果用 看不到它
tail
,则它不在文件中。不过,它可能在 Python 程序的写入缓冲区中。写入文件时的习惯行为是 C 库缓冲输出,直到写入一个完整的块(例如 4096 字节等),而不是立即将所有写入发送到操作系统。这节省了系统调用开销。这在 Python 中是类似的。(我不确定它是否使用 C 库,或者它本身是否进行类似的缓冲,但最终结果是相同的。)
对于终端的输出,默认是行缓冲:当写入换行符时,缓冲区被写出。当然,如果文件关闭,任何缓冲区也会被刷新,但这确实不是很有效。
要解决此问题,请
f.flush()
在 each 之后调用f.write()
,完全禁用缓冲。在这个关于 SO 的问题中有一些方法可以做到这一点:禁用输出缓冲