У меня есть файл журнала, записываемый другим процессом, который я хочу наблюдать за изменениями. Каждый раз, когда происходит изменение, я хотел бы прочитать новые данные, чтобы выполнить их обработку.
Какой лучший способ сделать это? Я надеялся, что из библиотеки PyWin32 будет какая-то зацепка. Я нашел win32file.FindNextChangeNotification
функцию, но не знаю, как попросить ее посмотреть конкретный файл.
Если кто-нибудь сделал что-то подобное, я был бы очень рад услышать, как ...
[Править] Я должен был упомянуть, что я был за решение, которое не требует опроса.
[Править] Проклятия! Кажется, это не работает на подключенном сетевом диске. Я предполагаю, что Windows не «слышит» никаких обновлений файла, как это происходит на локальном диске.
strace
контрольныеwrite
вызовыОтветы:
Вы уже просмотрели документацию, доступную по адресу http://timgolden.me.uk/python/win32_how_do_i/watch_directory_for_changes.html ? Если вам нужно, чтобы он работал только под Windows, 2-й пример кажется именно тем, что вы хотите (если вы поменяете путь к каталогу с тем файлом, который вы хотите просмотреть).
В противном случае опрос, вероятно, будет единственным действительно независимым от платформы вариантом.
Примечание: я не пробовал ни одно из этих решений.
источник
Вы пытались использовать Watchdog ?
источник
easy_install
? Проверьте. Бесплатная лицензия? Проверьте . Решает проблему на больших платформах? Проверьте . Я поддерживаю этот ответ. Единственное примечание: пример на странице проекта не работает "из коробки". Вместо этого используйте тот на их github .Если опрос достаточно хорош для вас, я просто посмотрю, не изменится ли статистика файла «измененное время». Чтобы прочитать это:
(Также обратите внимание, что решение событий собственных изменений Windows не работает при любых обстоятельствах, например, на сетевых дисках.)
источник
if self._cached_stamp is not None
.Если вы хотите мультиплатформенное решение, проверьте QFileSystemWatcher . Вот пример кода (не санированный):
источник
watchdog
PySide
для этого, а неPyQt
для такого маленького использования.Он не должен работать на Windows (может быть, с Cygwin?), Но для пользователя Unix, вы должны использовать системный вызов "fcntl". Вот пример в Python. Это в основном тот же код, если вам нужно написать его на C (те же имена функций)
источник
Проверьте pyinotify .
inotify заменяет dnotify (из более раннего ответа) в новых linux и позволяет осуществлять мониторинг на уровне файлов, а не на уровне каталогов.
источник
Ну, после небольшого взлома сценария Тима Голдена, у меня есть следующее, которое, кажется, работает довольно хорошо:
Вероятно, это можно сделать с дополнительной проверкой ошибок, но для простого просмотра файла журнала и некоторой обработки его перед выпуском на экран это работает хорошо.
Спасибо всем за ваш вклад - отличный материал!
источник
Для просмотра отдельного файла с опросом и минимальными зависимостями, вот полностью выделенный пример, основанный на ответе Дистана (выше):
источник
watch_file
и_cached_stamp
в списки, и итерация по ним в цикле. Хотя не очень хорошо масштабируется для большого количества файловcall_func_on_change()
будет запущен при первом запускеlook()
, но затем_cached_stamp
обновляется, поэтому не будет запускаться снова, пока значение неos.stat(self.filename).st_mtime. _cached_stamp
изменится._cached_stamp
в конструкторе, если вы не хотитеcall_func_on_change()
чтобы его вызывали при первом запускеself.call_func_on_change(self) def custom_action(): watcher = Watcher(watch_file, custom_action())
Но это не сработало Действие был вызван только во время первой итерации: Файл изменился да, изменен файл изменен файл изменен файл изменен Он начал работать , когда я держал * арг и называем это:watcher = Watcher(watch_file, custom_action)
Я борьба задаться вопросом , почему?Проверьте мой ответ на аналогичный вопрос . Вы можете попробовать тот же цикл в Python. Эта страница предлагает:
Также смотрите вопрос tail () в файле с Python .
источник
Самое простое решение для меня - использовать инструмент watchdo от watchdog
Из https://pypi.python.org/pypi/watchdog у меня теперь есть процесс, который ищет файлы sql в каталоге и выполняет их при необходимости.
источник
Ну, так как вы используете Python, вы можете просто открыть файл и продолжить чтение строк из него.
Если прочитанная строка не пуста , вы обрабатываете ее.
Возможно, вам не хватает того, чтобы продолжать звонить
readline
в EOF. В этом случае он просто будет возвращать пустую строку. И когда что-то добавляется в файл журнала, чтение будет продолжаться с того места, где оно остановилось, как вам нужно.Если вы ищете решение, которое использует события или определенную библиотеку, укажите это в своем вопросе. В противном случае, я думаю, что это решение просто отлично.
источник
Вот упрощенная версия кода Кендера, который, похоже, выполняет ту же самую задачу и не импортирует весь файл:
источник
Это еще одна модификация скрипта Тима Голдана, которая работает на Unix-типах и добавляет простой наблюдатель для модификации файла с использованием dict (file => time).
использование: whatName.py path_to_dir_to_watch
источник
Как вы можете видеть в статье Тима Голдена , на которую указывает Хорст Гутманн , WIN32 относительно сложен и следит за каталогами, а не за одним файлом.
Я хотел бы предложить вам взглянуть на IronPython , который является реализацией Python .NET . С IronPython вы можете использовать все функциональные возможности .NET, включая
Который обрабатывает отдельные файлы с простым интерфейсом событий .
источник
Это пример проверки файла на наличие изменений. Тот, который не может быть лучшим способом сделать это, но это, безусловно, короткий путь.
Удобный инструмент для перезапуска приложения, когда были внесены изменения в исходный код. Я сделал это во время игры с pygame, чтобы видеть эффекты, происходящие сразу после сохранения файла.
При использовании в pygame убедитесь, что содержимое цикла while размещено в вашем игровом цикле, также как и в обновлении. В противном случае ваше приложение застрянет в бесконечном цикле, и вы не увидите обновления вашей игры.
В случае, если вы хотели перезапустить код, который я нашел в Интернете. Вот. (Не относится к вопросу, хотя это может пригодиться)
Получайте удовольствие, заставляя электроны делать то, что вы от них хотите.
источник
.st_mtime
вместо.st_size
было бы более надежным и столь же коротким способом сделать это, хотя ОП указал, что он не хотел делать это путем опроса.источник
Вот пример, предназначенный для просмотра входных файлов, которые записывают не более одной строки в секунду, но обычно намного меньше. Цель состоит в добавлении последней строки (самой последней записи) в указанный выходной файл. Я скопировал это из одного из моих проектов и просто удалил все ненужные строки. Вам придется заполнить или изменить недостающие символы.
Конечно, охватывающий класс QMainWindow не является строго обязательным, т.е. Вы можете использовать QFileSystemWatcher в одиночку.
источник
Вы также можете использовать простую библиотеку под названием repyt , вот пример:
источник
Кажется, никто не опубликовал fswatch . Это кроссплатформенный наблюдатель файловой системы. Просто установите его, запустите и следуйте инструкциям.
Я использовал его с программами Python и Golang, и он просто работает.
источник
related @ 4Oh4 solution - плавное изменение списка файлов для просмотра;
источник
Лучшее и простое решение - использовать пигтейл: https://pypi.python.org/pypi/pygtail
источник
Я не знаю какой-либо конкретной функции Windows. Вы можете попробовать получить хэш MD5 файла каждую секунду / минуту / час (зависит от того, насколько быстро он вам нужен) и сравнить его с последним хешем. Когда он отличается, вы знаете, что файл был изменен, и вы читаете самые новые строки.
источник
Я бы попробовал что-то подобное.
Цикл проверяет, есть ли новая строка (строки) с момента последнего чтения файла - если он есть, он читается и передается
functionThatAnalisesTheLine
функции. Если нет, скрипт ждет 1 секунду и повторяет процесс.источник