![](/img/trans.png)
[英]How to read a file as it is being written in real time with Python 3 and asyncio, like "tail -f"
[英]tail and less commands not monitoring file in real time
我正在寻找一种方法来监视由 Linux 上的程序写入的文件。 我在这里找到了tail -F
命令,还推荐了less +FG
。 我通过在一个终端中运行tail -F file
和一个简单的 python 脚本来测试它:
import time
for i in range(20):
print i
time.sleep(0.5)
在另一个。 我将输出重定向到文件:
python script.py >> file
我预计tail
会跟踪文件内容并以固定的时间间隔更新显示,而不是仅显示命令终止后写入文件的内容。
同样的事情发生在less +FG
以及我观察cat
的输出时。 我也试过使用通常的重定向来截断文件>
而不是>>
。 这里它说文件被截断了,但仍然没有实时跟踪它。
知道为什么这不起作用吗? ( 这里建议它可能是由于缓冲写入,但由于我的脚本运行超过 10 秒,我怀疑这可能不是原因)
编辑:以防万一,我正在运行 Linux Mint 18.1
Python 的标准输出是缓冲的。 如果关闭脚本/脚本完成后,您会看到所有输出 - 这绝对是缓冲区问题。
您可以改用它:
import time
import sys
for i in range(20):
sys.stdout.write('%d\n' % i)
sys.stdout.flush()
time.sleep(0.5)
我已经测试过它并实时打印值。 为了克服缓冲区问题,在每个.write()
方法之后,我使用.flush()
强制“刷新”缓冲区。
评论中的其他选项:
sys.stdout.flush()
后缀的原始print
语句python -u
为无缓冲的二进制标准输出和标准错误运行 python 脚本关于 jon1467 答案(抱歉不能评论你的答案),你对重定向的理解是错误的。
试试这个:
dd if=/dev/urandom > test.txt
在查看文件大小时:
ls -l test.txt
您会在 dd 运行时看到文件增长。
Vinny 的回答是正确的,python 标准输出被缓冲。 您注意到的“缓冲效果”的更常见方法是按照 Vinny 向您展示的刷新标准输出。
您还可以使用-u
选项禁用整个 python 进程的缓冲,或者您可以重新打开标准输出,缓冲区大小为 0,如下所示(至少在 python2 中):
sys.stdout = os.fdopen(sys.stdout.fileno(), 'w', 0)
声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.