使用Python的select.kqueue()检查文件是否被修改、删除或扩展

0 投票
1 回答
1240 浏览
提问于 2025-04-17 05:21

你好,我在理解如何使用BSD专用的Python模块类select.kqueue和select.kevent来设置文件写入事件的监控时遇到了困难。

我想写一个Python程序,当另一个进程向一个文本文件写入内容时,它能够做出反应。我的测试代码如下:

    import os
    myfd = os.open("/Users/hari/c2cbio/t.txt",os.O_RDONLY)
    my_event=select.kevent(myfd,filter=select.KQ_FILTER_VNODE,fflags=select.KQ_NOTE_WRITE|select.KQ_NOTE_EXTEND)

    # I now create a kqueue object and a control object

    kq = select.kqueue()
    # I dont know how to set the max_events if it is non zero the REPL does not return
    kq.control([my_event],0,None)

我不知道接下来该怎么做来检查这些事件是否真的发生了。有没有人能给我一个使用kqueue来检测文件修改或其他事件(比如文件删除、文件重命名等)的例子呢?

1 个回答

0

我查看了看门狗模块的代码,得出了这个结论。我不太确定这些标志是否必要。

#/usr/bin/env python
import select
import os

kq = select.kqueue()
# Use the OSX specific os.EVTONLY
# http://code.google.com/p/python-watchdog/source/browse/src/watchdog/observers/kqueue.py
fd = os.open("/Users/hari/c2cbio/t.txt", 0x8000)

ev = [select.kevent(fd, filter=select.KQ_FILTER_VNODE,flags=select.KQ_EV_ADD | select.KQ_EV_ENABLE | select.KQ_EV_CLEAR,fflags=select.KQ_NOTE_WRITE | select.KQ_NOTE_EXTEND)]
#This call will block till the write or extend events occur
evts = kq.control(ev,1,None)
print "event occurred"

撰写回答