66
votes

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?

4
What platform? Windows has a system service to register a callback when a directory or file changes. - PaulMcG
Linux, but I'd prefer to make the program cross-platform compatible. - Thomas Ward
If you're programming for Windows you might consider the .Net File System Watcher. ironpython.info/index.php/Watching_the_FileSystem - HK1
@TobiasKienzler it is so-so, this question wants to watch a single file. - Antti Haapala

4 Answers

45
votes

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.

80
votes

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.

7
votes

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.

5
votes

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