使用 tail 实时观察文件写入情况

使用 tail 实时观察文件写入情况

我有一个 python 程序,它正在缓慢地生成一些输出。

我想将其捕获到文件中,但我还认为我可以用尾巴实时观看它。

因此,在一个终端中我执行以下操作:

python myprog.py > output.txt

在另一个终端中:

tail -f output.txt

但是在 Python 程序运行时,尾部似乎没有显示任何内容。

如果我按下 ctrl-c 来终止 python 脚本,突然间 的尾部output.txt开始填满。但在 python 运行时不会发生这种情况。

我究竟做错了什么?

答案1

您可能还需要明确刷新缓冲区,以便在生成时将其通过管道传输。这是因为通常仅在管道缓冲区填满(我相信以千字节为单位)以及 stdin 消息结束时才打印输出。这可能是为了节省读/写。您可以在每次打印后执行此操作,或者如果您正在循环,则可以在循环中的最后一次打印后执行此操作。

import sys
...
print('Some message')
sys.stdout.flush()

答案2

使用无缓冲标志运行 python:

python -u myprog.py > output.txt

然后将实时打印输出。

答案3

不要尝试 tail 实时文件,tee而是使用。它正是用来执行您要执行的操作的。

男人三通

tee(1) - Linux 手册页

姓名 tee-从标准输入读取并写入标准输出和文件

概要

tee [OPTION]... [FILE]...

描述

将标准输入复制到每个文件,并复制到标准输出。

-a, --append  
   append to the given FILEs, do not overwrite  
-i, --ignore-interrupts  
   ignore interrupt signals   
--help  
   display this help and exit  
--version
   output version information and exit

如果文件为 -,则再次复制到标准输出。

因此,对于你的情况,你应该运行:

python myprog.py | tee output.txt

编辑:正如其他人指出的那样,除非sys.stdout.flush()在 Python 程序中使用,否则此答案将遇到 OP 最初遇到的相同问题,如 Davey 的接受答案中所述。我在发布此答案之前所做的测试并未准确反映 OP 的用例。

tee仍然可以用作替代方法(尽管不是最佳方法),即在显示输出的同时写入文件,但戴维的答案显然是正确且最好的答案。

答案4

当我使用 tail 时,它几乎总是跟踪日志文件,例如(电子邮件)消息。

这可能有点不着边际,但是为什么不在 Python 代码中使用print// print()write()而使用日志模块呢?(来自 PSL)NB:可以配置日志格式化程序以不输出与传统日志相关的所有时间和 ID 代码。

输出可以配置为转到(数据)文件,并且由于没有缓冲延迟或重定向,tail 可以顺利且立即地工作。

问候

相关内容