我正在连续写入一个文件,并且我想从另一个 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")
有没有办法查看正在写入的文件的内容?
答案1
如果使用 无法看到它tail
,则它不在文件中。
不过,它可能位于 Python 程序的写入缓冲区中。写入文件时的习惯行为是,C 库缓冲输出直到写入完整块(例如 4096 字节等),而不是立即将所有写入发送到操作系统。这节省了系统调用开销。这在Python 中也是类似的。(我不确定它是否使用 C 库,或者它本身是否进行类似的缓冲,但最终结果是相同的。)
对于输出到终端,默认是行缓冲:当写入换行符时,缓冲区被写出。当然,如果文件关闭,任何缓冲区也会被刷新,但这确实不是很有效。
要解决此问题,请f.flush()
在 every 之后调用f.write()
,完全禁用缓冲。在这个问题中,有一些方法可以做到这一点:禁用输出缓冲