Обнаружение изменения файла без опроса

Я пытаюсь использовать метод внутри программы Python, чтобы определить, был ли изменен файл в файловой системе. Я знаю, что я мог бы что-то запустить каждые 5 секунд, чтобы проверить дату последней модификации системы, но мне было любопытно, есть ли более простой способ для этого, без необходимости требовать от моей программы повторной проверки.

Кто-нибудь знает о таком методе?

Ответ 1

Для linux существует pyinotify.

На главной странице:

Pyinotify - это модуль Python для мониторинг изменений файловой системы. Pyinotify полагается на ядро ​​Linux функция (объединенная в ядре 2.6.13) называется inotify. inotify - это событие-уведомитель, его уведомления экспортируются из ядра пространство для пользователя через три системные вызовы. pyinotify связывает эти системных вызовов и предоставляет реализация на их основе общий и абстрактный способ манипулировать этими функциональными возможностями.

Таким образом, он, очевидно, не является кросс-платформенным и полагается на достаточно новую версию ядра. Однако, насколько я могу судить, требующая поддержки ядра будет верна в отношении любого механизма без опроса.

Ответ 2

watchdog

Отличная библиотека перекрестной платформы для просмотра каталогов.

С веб-сайта

Поддерживаемые платформы

  • Linux 2.6 (inotify)

  • Mac OS X (FSEvents, kqueue)

  • FreeBSD/BSD (kqueue)

  • Windows (ReadDirectoryChangesW с портами ввода-вывода, рабочие потоки ReadDirectoryChangesW)

  • Независимо от ОС (опрос диска для моментальных снимков каталога и их периодическое сравнение, медленное и не рекомендуется)

Я использовал его в нескольких проектах, и, похоже, он работает чудесно.

Ответ 3

В окнах есть:

watcher, который является хорошим портом python API.NET FileSystemWatcher.

Также есть (тот, который я написал) dirwatch.

Оба полагаются на функцию ReadDirectoryChangesW. Хотя для реальной работы я бы использовал watcher (правильное расширение C, хороший API, поддержка python 2 и 3).

Mine - это в основном эксперимент, вызывающий соответствующие API-интерфейсы на окнах, поэтому интересно только, если вы хотите пример вызова этих вещей из python.

Ответ 4

Вы также должны увидеть inotifyx, который очень похож на ранее упомянутый pyinotify, но, как говорят, имеет API, который изменяется меньше.