【问题标题】:Detect File Change Without Polling [duplicate]无需轮询即可检测文件更改[重复]
【发布时间】:2011-08-09 22:54:22
【问题描述】:

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

有人知道这种方法吗?

【问题讨论】:

  • 什么平台? Windows 有一个系统服务可以在目录或文件更改时注册回调。
  • Linux,但我更愿意让程序跨平台兼容。
  • 如果您正在为 Windows 编程,您可能会考虑使用 .Net File System Watcher。 ironpython.info/index.php/Watching_the_FileSystem
  • @TobiasKienzler 马马虎虎,这个问题想看一个single文件。

标签: python


【解决方案1】:

watchdog

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

来自网站

支持的平台

  • Linux 2.6(inotify)

  • Mac OS X(FSEvents、kqueue)

  • FreeBSD/BSD(kqueue)

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

  • 独立于操作系统(轮询磁盘以获取目录快照并定期比较它们;速度慢且不推荐)

我在几个项目中使用过它,它似乎工作得很好。

【讨论】:

  • 命令行工具非常适合在开发中使用。感谢您的提示。
  • 从看门狗网站上给出的例子看,它看起来需要轮询。
  • @ZauberParacelsus:它没有。该示例执行time.sleep(1) 以使示例保持活动状态,但看门狗实际上是异步的,并且会在文件更改事件的情况下调用 event_handler。
  • 看来 watchdog 只适用于目录。有没有办法在不进行轮询的情况下观察非目录文件的更改(使用内核 inotify)?
【解决方案2】:

对于 linux,有pyinotify

来自主页:

Pyinotify 是一个 Python 模块,用于 监控文件系统的变化。 Pyinotify 依赖于 Linux 内核 功能(在内核 2.6.13 中合并) 称为inotify。 inotify 是一个 事件驱动的通知器,它的 通知从内核导出 通过三个空间到用户空间 系统调用。 pyinotify 绑定这些 系统调用并提供一个 在他们之上实施 一种通用和抽象的方法 操作这些功能。

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

【讨论】:

  • pyinotify可以用来检测修改文件的具体程序吗?
  • objections against it 仍然有效吗?
  • 这个包不存在了
  • @AshokaLella:这个包是存在的,但是项目已经从SF转移到了github。我已经更新了链接。
【解决方案3】:

在windows上有:

watcher,它是 .NET FileSystemWatcher API 的一个不错的 Python 端口。

还有(我写的那个)dirwatch

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

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

【讨论】:

  • watcher 似乎已经被遗弃了一段时间并且缺乏适当的文档。
  • 是的,自 2011 年以来情况发生了变化......看起来看门狗是这些天最好的选择。
【解决方案4】:

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

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2015-05-16
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2017-08-26
    相关资源
    最近更新 更多