Detect File Change Without Polling
PythonPython 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
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.