В Python авто-перезагрузка кода можно реализовать с помощью модуля importlib
. Этот модуль предоставляет функциональность для динамической загрузки модулей и перезагрузки уже загруженных модулей.
Прежде всего, необходимо импортировать модуль importlib
:
import importlib
Для авто-перезагрузки кода нужно создать функцию, которая будет выполнять перезагрузку модуля и вызывать эту функцию после каждого изменения кода. Вот пример такой функции:
def autoreload(module): importlib.reload(module)
Здесь функция autoreload
использует функцию reload
из модуля importlib
, чтобы перезагрузить заданный модуль.
Однако, существует проблема - изменения файловой системы обычно не обнаруживаются непосредственно в Python, поэтому для обнаружения изменений вы можете использовать модуль watchdog
. Это позволит автоматически обнаруживать изменения в файлах и запускать перезагрузку кода.
Для использования модуля watchdog
вы должны сначала установить его:
pip install watchdog
Затем в вашем скрипте с авто-перезагрузкой кода нужно добавить следующий код:
import time from watchdog.observers import Observer from watchdog.events import FileSystemEventHandler class CodeChangeHandler(FileSystemEventHandler): def __init__(self, module): self.module = module def on_any_event(self, event): if event.is_directory: # игнорируем события для директорий return if event.src_path.endswith('.py'): # проверяем только файлы с расширением .py autoreload(self.module) def autoreload(module): importlib.reload(module) if __name__ == "__main__": # создаем экземпляр Observer и добавляем CodeChangeHandler как обработчик событий observer = Observer() observer.schedule(CodeChangeHandler(__import__('__main__')), path='.', recursive=True) observer.start() try: while True: time.sleep(1) except KeyboardInterrupt: observer.stop() observer.join()
В этом примере добавлен класс CodeChangeHandler
, который является наследником класса FileSystemEventHandler
из модуля watchdog
. Этот класс отслеживает изменения в файлах и вызывает функцию autoreload
, чтобы перезагрузить код.
Затем создается экземпляр Observer и добавляется обработчик событий. Параметр path
указывает путь к каталогу, который нужно наблюдать, а параметр recursive
указывает, следует ли рекурсивно отслеживать изменения во всех подкаталогах.
Наконец, в основном блоке выполняется бесконечный цикл, который предотвращает завершение программы, пока не будет нажата комбинация клавиш Ctrl+C
. При нажатии Ctrl+C
прерывается Observer.
Теперь, при каждом изменении файлов в наблюдаемом каталоге с расширением .py
, код будет автоматически перезагружаться. Это позволяет вам без перезапуска скрипта просматривать все изменения, которые вы вносите в код Python.