Как сделать авто-перезагрузку кода Python?

В 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.