Как импортировать библиотеку, а после удалить её (unimport) и почистить за ней мусор

Я пытаюсь найти +- похожее или готовое решения в работающих/open_source проектах для моей проблемы

У меня сейчас стоит задачка разработать (написать) модуль, который должен делать следующее:

  1. В основной (главной) программе с помощью "ново-написанного" модуля подгрузить (динамически импортировать) библиотеки. Какие именно библиотеки это будут, я зарание не знаю (буду получать их в виде списка и т.п.)
  2. Выполнить определённую бизнес логику с помощью этих библиотек
  3. Вернуться в тело основной программы, предварительно почистив мусор (импортированные библиотеки)

Сейчас я сделал довольно по простому. Т.е. у меня есть некий контекстный менеджер, в который оборачивается код, который подгружает библиотеки и работает с ними. Конт. менеджер "запоминает", что было ДО и после выхода из менеджера пытается вернуть всё так, как было до его запуска.

Enough word, show the CODE!

Контекстный менеджер:

@contextmanager
def path_and_modules_keeper(libs_path: str) -> None:
    old_sys_modules = sys.modules.copy()
    old_sys_path = sys.path[:]
    sys.path.insert(0, libs_path)
    try:
        yield
    finally:
        sys.path = old_sys_path
        current_sys_modules = sys.modules.copy()
        for key in current_sys_modules.keys():
            if old_sys_modules.get(key) is None:
                del sys.modules[key]

Как он применяется:

def do_business_logic(libs_path):
    with path_and_modules_keeper(libs_path):
        ...
        load_libs(libs_path)
        result = some_business_logic()
        ...
        return result

Буду благодарен любым мыслям и советам =)


Ответы (1 шт):

Автор решения: Victor VosMottor

Какая-то странная идея... Но это конечно можно:

del module_name

Или

import sys
sys.modules.pop('module_name')

Но зачем?

→ Ссылка