我正在编写两个解析文件的Python脚本。一个是标准的unix日志文件,另一个是二进制文件。我试图找出最好的方法来监视这些,这样我就可以在数据更新后立即读取数据。到目前为止,我发现的大多数解决方案都是与Linux相关的,但我需要在FreeBSD中使用它。在Python中即时阅读更新的文件
显然,一种方法是每隔X时间运行我的脚本,但这看起来很糟糕,效率很低。如果我希望我的Python应用程序在后台连续运行,监视文件并在更改/更新后对其执行操作,那么我最好的办法是什么?
我正在编写两个解析文件的Python脚本。一个是标准的unix日志文件,另一个是二进制文件。我试图找出最好的方法来监视这些,这样我就可以在数据更新后立即读取数据。到目前为止,我发现的大多数解决方案都是与Linux相关的,但我需要在FreeBSD中使用它。在Python中即时阅读更新的文件
显然,一种方法是每隔X时间运行我的脚本,但这看起来很糟糕,效率很低。如果我希望我的Python应用程序在后台连续运行,监视文件并在更改/更新后对其执行操作,那么我最好的办法是什么?
您是否尝试过KQueue事件?
http://docs.python.org/library/select.html#kqueue-objects
kqueue的是inotify的(文件变更通知服务)的在FreeBSD/OS版本。我没有用过,但我认为这是你想要的。
我曾经为一个用Python构建的解析器做了一个守护进程。我需要观察一系列文件并使用Python进行处理,并且它必须是一个真正的多操作系统解决方案(在这种情况下,Windows为& Linux)。我编写了一个程序,通过检查修改时间来监视文件列表。该程序睡了一会儿,然后检查正在观看的文件的修改时间。如果修改时间比先前注册的时间更新,则文件已更改,因此必须使用此文件完成相关任务。
事情是这样的:
import os
import time
path = os.path.dirname(__file__)
print "Looking for files in", path, "..."
# get interesting files
files = [{"file" : f} for f in os.listdir(path) if os.path.isfile(f) and os.path.splitext(f)[1].lower() == ".src"]
for f in files:
f["output"] = os.path.splitext(f["file"])[0] + ".out"
f["modtime"] = os.path.getmtime(f["file"]) - 10
print " watching:", f["file"]
while True:
# sleep for a while
time.sleep(0.5)
# check if anything changed
for f in files:
# is mod time of file is newer than the one registered?
if os.path.getmtime(f["file"]) > f["modtime"]:
# store new time and...
f["modtime"] = os.path.getmtime(f["file"])
print f["file"], "has changed..."
# do your stuff here
它看起来不像顶尖的代码,但它工作得很好。
还有其他关于这个SO问题,但我不知道他们是否会提供直接回答你的问题:
How to implement a pythonic equivalent of tail -F?
How do I watch a file for changes?
How can I "watch" a file for modification/change?
希望这有助于!
感谢您的回复。我希望获得非轮询解决方案,并不确定是否可以从kqueue获取此功能。根据你的一个链接,我要去看看看门狗,看看它是否有帮助。 – fbd39j 2011-03-29 19:27:01
你不能使用'tail -f'吗? – 2011-03-29 18:10:26
与二进制文件不完全配合:) – fbd39j 2011-03-29 19:07:54