Щоб виконувати зміни, відповідно до подій файлової системи для Пайтона існує бібліотека Watchdog. Взагалі аналогів існує багато, а принцип роботи полягає в тому, що скрипт з певним інтервалом часу перевіряє всі файли у списку моніторингу, і якщо дата модифікації файлу змінилася, виконуються необхідні дії. Я також писав схожу штуку, код можна подивитися на гітхабі. Для Linux-систем існує трохи інший підхід, коли ядро операційної системи само сповіщує про зміни у файловій системі. Так відпадає необхідність постійно в циклі опитувати мільярд файлів. На основі цього побудована бібліотека pyinotify.

Отож, завдання полягає в тому, щоб скрипт повідомляв про редагування файлів певного типу (python-скрипти) в поточній папці. Створюємо новий клас обробника, де вказуємо необхідні патерни для файлів.

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
class ScriptModifiedHandler(PatternMatchingEventHandler):
patterns = ['*.py']

def __init__(self):
super(ScriptModifiedHandler, self).__init__()
# you can add some init code here

def process(self, event):
print(event.src_path, event.event_type)

def on_modified(self, event):
self.process(event)

def on_moved(self, event):
pass

def on_deleted(self, event):
pass

def on_created(self, event):
pass

Чотири методи: on_modified, on_moved, on_deleted, on_created дозволяють зробити окремий обробник для кожної події. Ми будемо просто виводити текст в консоль і лише на модифікацію файлу. Далі потрібно додати спостерігача, який буде використовувати даний обробник.

1
2
3
4
5
6
7
8
9
10
11
observer = Observer()
path = '.'
event_handler = ScriptModifiedHandler()
observer.schedule(event_handler, path, recursive=True)
observer.start()
try:
while True:
time.sleep(1)
except KeyboardInterrupt:
observer.stop()
observer.join()

Створюємо екземпляр Спостерігача і Обробника і вказуємо для спостерігача папку, за якою наглядати (recursive=True вказує, що за підпапками також треба слідкувати, path - шлях до потрібної папки. Крапка відповідає директорії, з якої запущений скрипт). Повний код скрипта gist. Запустити так

1
$ python watch.py

Спробуйте відредагувати ще якийсь *.py-файл і отримайте нотифікацію про це в консоль. Зупинити виконання можна комбінаціює Ctrl+C.