Detect File Change Without Polling

Python

Python Problem Overview


I'm trying to use a method within a Python program to detect whether a file on the file system has been modified. I know that I could have something run on an every-5-seconds to check the last modification date off of the system, but I was curious as to whether there's an easier method for doing this, without needing to require my program to check repeatedly.

Does anyone know of such a method?

Python Solutions


Solution 1 - Python

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.

Solution 2 - 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.

Solution 3 - Python

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.

Solution 4 - Python

You should also see inotifyx which is very similar to the previously mentioned pyinotify, but is said to have an API which changes less.

Attributions

All content for this solution is sourced from the original question on Stackoverflow.

The content on this page is licensed under the Attribution-ShareAlike 4.0 International (CC BY-SA 4.0) license.

Content TypeOriginal AuthorOriginal Content on Stackoverflow
QuestionThomas WardView Question on Stackoverflow
Solution 1 - PythonnemithView Answer on Stackoverflow
Solution 2 - PythonAleksi TorhamoView Answer on Stackoverflow
Solution 3 - PythonotherchirpsView Answer on Stackoverflow
Solution 4 - PythonAJ00200View Answer on Stackoverflow