Detectar cambio de archivo sin sondeo

Estoy intentando usar un método dentro de un progtwig de Python para detectar si un archivo en el sistema de archivos ha sido modificado. Sé que puedo hacer que se ejecute algo cada 5 segundos para verificar la última fecha de modificación del sistema, pero tenía curiosidad por saber si hay un método más fácil para hacerlo, sin necesidad de requerir que mi progtwig lo compruebe repetidamente. .

¿Alguien sabe de tal método?

Para linux, hay pyinotify .

Desde la página de inicio:

Pyinotify es un módulo de Python para monitorear los cambios de los sistemas de archivos. Pyinotify se basa en una característica del kernel de Linux (fusionada en el kernel 2.6.13) llamada inotify. inotify es un notificador controlado por eventos, sus notificaciones se exportan desde el espacio del kernel al espacio del usuario a través de tres llamadas al sistema. pyinotify une estas llamadas al sistema y proporciona una implementación sobre ellas ofreciendo una forma genérica y abstracta de manipular esas funcionalidades.

Por lo tanto, obviamente no es multiplataforma y se basa en una nueva versión del kernel. Sin embargo, por lo que puedo ver, requerir el soporte del kernel sería cierto respecto de cualquier mecanismo de no sondeo.

perro guardián

Excelente biblioteca multiplataforma para ver directorios.

Desde el sitio web

Plataformas soportadas

  • Linux 2.6 (inotify)

  • Mac OS X (FSEvents, kqueue)

  • FreeBSD / BSD (kqueue)

  • Windows (ReadDirectoryChangesW con puertos de finalización de E / S; ReadDirectoryChangesW worker threads)

  • Independiente del sistema operativo (sondear el disco para las instantáneas de directorio y compararlas periódicamente; lento y no recomendado)

Lo he usado en un par de proyectos y parece funcionar maravillosamente.

En las ventanas hay:

observador , que es un buen puerto de Python de la API de .NET FileSystemWatcher.

También hay (el que escribí) dirwatch .

Ambos se basan en la función Windows ReadDirectoryChangesW . Aunque para trabajo real, usaría watcher (extensión C adecuada, buena API, compatibilidad con Python 2 y 3).

El mío es principalmente un experimento que llama a las API relevantes en Windows, así que solo es interesante si quieres un ejemplo de cómo llamar estas cosas desde Python.

También debería ver inotifyx, que es muy similar al pyinotify mencionado anteriormente, pero se dice que tiene una API que cambia menos.