在没有轮询的情况下检测文件更改

Tho*_*ard 62 python

我正在尝试使用Python程序中的方法来检测文件系统上的文件是否已被修改.我知道我可以在每5秒运行一次以检查系统的最后修改日期,但我很好奇是否有更简单的方法来执行此操作,而无需要求我的程序重复检查.

有谁知道这样的方法?

nem*_*ith 78

看家狗

用于观看目录的优秀跨平台库.

来自网站

支持的平台

  • Linux 2.6(inotify)

  • Mac OS X(FSEvents,kqueue)

  • FreeBSD/BSD(kqueue)

  • Windows(带有I/O完成端口的ReadDirectoryChangesW; ReadDirectoryChangesW工作线程)

  • 独立于操作系统(轮询磁盘以查找目录快照并定期比较它们;慢而不推荐)

我已经在几个项目中使用它,它似乎工作得非常好.

  • @ZauberParacelsus:事实并非如此.该示例使用`time.sleep(1)`来保持示例处于活动状态,但看门狗实际上是异步的,并且在文件更改事件的情况下将调用event_handler. (3认同)

Ale*_*amo 44

对于linux,有pyinotify.

从主页:

Pyinotify是一个用于监视文件系统更改的Python模块.Pyinotify依赖于称为inotify的Linux内核功能(在内核2.6.13中合并).inotify是一个事件驱动的通知程序,它的通知通过三个系统调用从内核空间导出到用户空间.pyinotify绑定这些系统调用,并在它们之上提供一个实现,提供一种通用和抽象的方式来操作这些功能.

因此,它显然不是跨平台的,并且依赖于足够新的内核版本.但是,据我所知,任何非轮询机制都需要内核支持.

  • [反对它](http://www.serpentine.com/blog/2008/01/04/why-you-should-not-use-pyinotify/comment-page-1/)仍然有效吗? (2认同)

oth*_*rps 6

在窗户上有:

watcher,这是.NET FileSystemWatcher API的一个很好的python端口.

还有(我写的那个)dirwatch.

两者都依赖于Windows ReadDirectoryChangesW函数.虽然对于实际工作,我会使用观察者(适当的C扩展,良好的API,python 2和3支持).

我的主要是在Windows上调用相关API的实验,所以如果你想要一个从python调用这些东西的例子,这很有趣.


AJ0*_*200 5

您还应该看到inotifyx,它与前面提到的 pyinotify 非常相似,但据说有一个变化较少的 API。