Как отслеживать события файловой системы на Python

Формат документа: pdf
Размер документа: 0.67 Мб




Прямая ссылка будет доступна
примерно через: 45 сек.




Теги: IT. Python. программирование. перевод
  • Сообщить о нарушении / Abuse
    Все документы на сайте взяты из открытых источников, которые размещаются пользователями. Приносим свои глубочайшие извинения, если Ваш документ был опубликован без Вашего на то согласия.

1


Как отслежиZlvkh[ulbynZcehой системы на
Python
Источник : How to Monitor File System Events in Python .
Дата публикации источника: 8 июня 2020 года.

ИспользоZgb_ модуля watchdog — кроссплатформенного API для
отслеживания изменения ваших файлов.
В этой статье вы узнаете, как обнаружиZlvbaf_g_gbykms_klующих файло\
Zr_fijbeh`_gbbgZ3\WKRQFuоспользуемся модулем watchdog , кото рый хорошо
поддержиZ_lky разработчиками. Согласно официальной документации, watchdog —
это «... Python -библиотека с API и утилиты командной оболочки для отслеживания
событий файлоhckbkl_fu.
Она поддержиZ_l как Python 2.7, так и _jkbb 3.4+. Однако для более старых
_jkbc рекомендуется использоZlv watchdog 0.10.0. В этом руководстве я затрону
только данную Python -библиотеку, предостаeyxsmx соот_lklующий API. ДаZcl_
перейдем к следующему параграфу и начнем устаноdmg_h[oh^bfuofh^me_c.
УстаноdZ
С помощью pip install можно легко и без проблем устаноblv данный модуль.
Перед тем как продолжить, настоятельно рекомендуется создать bjlmZevgh_
окружение. Есть дZih^oh^Z:
Установка из PyPI
Отпраvl_gZ\uiheg_gb_ke_^mxsmxdhfZg^m\l_jfbgZe_:
pip install watchdog
Она установит последнюю _jkbxba PyPI, то есть 0.10.2 на момент подготовки
этой статьи. Прим. пер.: на момент начала перевода этой статьи устанаebалась
_jkby.
Установка из репозитория исходного кода
Кроме того, u можете клониров ать репозиторий в сhx локальную папку и
устаноblv его как обычно. Сначала даZcl_ выполним клонироZgb_ с помощью
следующей команды:
git clone --recursive git://github.com/gorakhargosh/watchdog.git

2


Измените рабочую директорию с помощью команды ниже. Убед итесь, что 
рабочей директории есть файл setup.py .
cd watchdog
Установите данный модуль с помощью команды:
pip install -e .
Одно из глаguo преимущест клонироZgby watchdog прямо из репозитория 
том, что можно получить последнюю _jkbx обладающую допол нительными
hafh`ghklyfb.
Чтобы убедиться, что устаноdZijhreZmki_rghы можете \_klb терминале
следующую команду:
pip show watchdog
ДаZcl_i_j_c^_fdke_^mxs_fmjZa^_embgZqg_fibkZlvdh^gZ3\WKRQ.
ИспользоZgb_[b[ebhl_db
Основные строительные блоки watchdog — это следующие классы:
 Наблюдатель (Observer) .
 Обработчик событий (Event handler) .
Следовательно, использоZlvwlhlfh^mevg_keh`gh:
1. Создайте экземпляр класса watchdog.observers.Observer . Данный класс
предстаey_lkh[h й поток.
2. Определите подкласс обработчика событий с Zr_c собст_gghc
реализацией и создайте экземпляр этого подкласса.
3. Вызовите метод schedule экземпляра класса Observer , передаZyijbызо_
экземпляр обработчика событий. Этот метод принимает несколько др угих аргументо
например путь к отслежиZ_fhc^bj_dlhjbb.
4. Запустите поток Observer, и он будет генерироZlv события, инициирующие
uiheg_gb_f_lh^h обработчика событий.
Обработчик событий
На сегодня wlhffh^me_^hklmiguq_luj_lbiZ обработчикоkh[ulbc :
1. FileSystemEventHandler — основной обработчик событий файлоhc
системы, методы которого можно переопределить.

3


2. PatternMatchingEventHandler — сраgbает указанные шаблоны с теми
путями к файлам, к которым относятся происходящие события.
3. RegexMatchingEventHa ndler — сраgbает указанные регулярные
ujZ`_gbykl_fbimlyfbdnZceZfddhlhjufhlghkylkyijhbkoh^ysb_kh[ulby.
4. LoggingEventHandler — журналирует все зафиксироZggu_kh[ulby.
Остальные классы наследуются от FileSystemEventHandler , который
предостаey_l для переопределения следующие методы:
 on_any_event — обработчик k_okh[ulbc.
 on_created — вызыZ_lkyijbkha^ZgbbnZceZ^bj_dlhjbb.
 on_deleted — вызыZ_lkyijbm^Ze_gbbnZceZ^bj_dlhjbb.
 on_modified — uauается при модификации файла/директории.
 on_moved — вызыZ_lky при перемещении или переименоZgbb
файла/директории.
Импорт
Создайте новый файл с расширением «.py» и добаvl_ инструкции import,
при_^_ggu_gb`_v назоm этот новый файл просто — test.py .
from watchdog.observers import Observer
from watchdog.events import FileSystemEventHandler
Подкласс класса FileSystemEventHandler
Создайте новый класс на осно_ FileSystemEventHandler и переопределите
методы согласно Zrbfihlj_[ghklyfYgZahу сhcdeZkk MyHandler , но ufh`_l_
u[jZlvex[h_^jm]h_ имя.
class MyHandler (FileSystemEventHandler ):
def on_any_event (self , event ):
print (event.event_type, event.src_path)

def on_created (self , event ):
print ("on_created" , event.src_path)

def on_deleted (self , event ):
print ("on_deleted" , event.src_path)

def on_modified (self , event ):
print ("on_modified" , event.src_path)

4


def on_moved (self , event ):
print ("on_moved" , event.src_path)
Замените функцию print на код, реализующий нужный Zf функционал.
Каждый из этих методо предусматриZ_l параметр event, соответствующий объект
которого включает k_[yke_^mxsb_Zljb[mlu:
 event_type — тип события, предстаe_gguc  b^_ строки. Значение по
умолчанию — None .
 is_ directory , который ра_g True , если событие было сгенерироZgh для
директории, и False ijhlb\ghfkemqZ_.
 src_path — исходный путь к объекту файлоhc системы, который uaал
данное событие.
Наиболее полезный атрибут — это src_path , который можно использов ать,
чтобы перед uiheg_gb_f нужной Zf программной логики определить, какой файл
был изменен.
if (event.src_path == "./path/file.txt" ):
print ("Разместите свою программную логику здесь!" )
Observer и EventHandler
После создания подкласса u можете смело создать экземпляр этого ноh]h
класса, а также экземпляр класса Observer . Укажите нужный Zf путь для процесса
отслежиZgby изменений. Я создам папку json и буду следить за изменениями  ней.
Вы же можете выбрать л юбой другой интересующий вас путь.
Также u можете установить значение параметра recursive , но крайне
рекомендуется заранее определить иерархию директорий, а значение этого параметра
устаноblv  False , чтобы предотвратить проблемы с отсутствием пра на ра боту с
какой -нибудь вложенной папкой или предотвратить проблемы с доступом к ней.
Вызов метода start запустит поток, который будет генерироZlv события при
пояe_gbbdZdbo -либо изменений по соответствующему пути.
event_handler = MyHandler()
observer = Obse rver()
observer .schedule( event_handler , path ='./json/' , recursive =False )
observer .start()

5


Тестирование
Чтобы про_jblv отслежиZgb_ изменений, нужно реализоZlv бесконечный
цикл. При обработке исключения KeyboardInterrupt uah\bl_ метод stop , чтобы
осh[h^blvj_kmjku.
while True :
try :
pass
except KeyboardInterrupt :
observer.stop()
Прим. пер.: я бы предложил такой код вместо при_^_ggh]hыше:
while True :
make_it_stop = input ('Введите стоп, чтобы остановить программу' )
if make_it_stop == 'stop' :
observer .stop ()
break
Сохраните файл с кодом на Python и запустите его kоем терминале, используя
команду ниже. Не забудьте заменить  этой команде имя файла, если вы назвали его
иначе.
python test.py
Вы можете легко про_jblv работоспособность кода, создаZy новые файлы,
модифицируя содержимое файло и удаляя их из данной директории. Вот пример
uода:

6


Пожалуйста, учтите, что поведение программы и результаты ее работы могут
отличаться  заbkbfhklb от того, ка кой редактор u используете. Например,  Vim
есть такая проблема с событиями изменения файлов:
«Vim не изменяет файлы, если только ему яgh не поручено это делать. Он
создает резерgu_ копии файло а затем подменяет ими файлы, которые u
редактируете на д иске. Это значит, что если вы используете Vim для
редактирования своих файло то watchdog не будут фиксировать события
изменения этих файло<Zf[ulvfh`_lgm`gh[m^_lkhhlетстmxsbfh[jZahf
настроить Vim, чтобы отключить эту функцию».
Заключение
Даw йте резюмируем прочитанное.
Мы начали с устаноdb модуля watchdog через pip install или напрямую из
репозитория исходного кода.
Затем мы перешли к изучению доступных возможностей модуля и попробоZeb
его  деле. Мы создали подкласс класса FileSystemEventHa ndler и передали его в
качест_ аргумента методу schedule объекта класса Observer . Этот объект -
наблюдатель будет генерироZlv события и uauать соот_lklующие функции при
изменении файлоbebiZihd целевой директории.
Наконец, мы протестироZeb наш код для отслежиZgby событий посредством
создания нового файла, изменения содержимого файла и удаления файла из
отслежиZ_fhc^bj_dlhjbb.
Спасибо за внимание! Надеюсь, что мы уb^bfkykghа ke_^mxs_cklZlv_!
Ссылки
1. Страница watchdog на Github.
2. Документация watchdog.

От переh^qbdZ  группе ENRUIT u можете найти другие переводы,
предложить статью на перевод или принять участие  самом процессе перевода
статей.
X