2011-03-29 51 views
2

我正在编写两个解析文件的Python脚本。一个是标准的unix日志文件,另一个是二进制文件。我试图找出最好的方法来监视这些,这样我就可以在数据更新后立即读取数据。到目前为止,我发现的大多数解决方案都是与Linux相关的,但我需要在FreeBSD中使用它。在Python中即时阅读更新的文件

显然,一种方法是每隔X时间运行我的脚本,但这看起来很糟糕,效率很低。如果我希望我的Python应用程序在后台连续运行,监视文件并在更改/更新后对其执行操作,那么我最好的办法是什么?

+0

你不能使用'tail -f'吗? – 2011-03-29 18:10:26

+0

与二进制文件不完全配合:) – fbd39j 2011-03-29 19:07:54

回答

2

我曾经为一个用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?

希望这有助于!

+0

感谢您的回复。我希望获得非轮询解决方案,并不确定是否可以从kqueue获取此功能。根据你的一个链接,我要去看看看门狗,看看它是否有帮助。 – fbd39j 2011-03-29 19:27:01