Detect File Change Without Polling

On windows there is:

watcher, which is a nice python port of the .NET FileSystemWatcher API.

Also there's (the one I wrote) dirwatch.

Both rely on the windows ReadDirectoryChangesW function. Though for real work, I'd use watcher (proper C extension, good API, python 2 & 3 support).

Mine is mostly an experiment calling the relevant APIs on windows, so it's only interesting if you want an example of calling these things from python.


For linux, there is pyinotify.

From the homepage:

Pyinotify is a Python module for monitoring filesystems changes. Pyinotify relies on a Linux Kernel feature (merged in kernel 2.6.13) called inotify. inotify is an event-driven notifier, its notifications are exported from kernel space to user space through three system calls. pyinotify binds these system calls and provides an implementation on top of them offering a generic and abstract way to manipulate those functionalities.

Thus it is obviously not cross-platform and relies on a new enough kernel version. However, as far as I can see, requiring kernel support would be true about any non-polling mechanism.


watchdog

Excellent cross platform library for watching directories.

From the website

Supported Platforms

  • Linux 2.6 (inotify)

  • Mac OS X (FSEvents, kqueue)

  • FreeBSD/BSD (kqueue)

  • Windows (ReadDirectoryChangesW with I/O completion ports; ReadDirectoryChangesW worker threads)

  • OS-independent (polling the disk for directory snapshots and comparing them periodically; slow and not recommended)

I've used it on a couple projects and it seems to work wonderfully.

Tags:

Python