Обнаружение изменения файла без опроса
Я пытаюсь использовать метод внутри программы 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, который изменяется меньше.