Как импортировать библиотеку, а после удалить её (unimport) и почистить за ней мусор
Я пытаюсь найти +- похожее или готовое решения в работающих/open_source проектах для моей проблемы
У меня сейчас стоит задачка разработать (написать) модуль, который должен делать следующее:
- В основной (главной) программе с помощью "ново-написанного" модуля подгрузить (динамически импортировать) библиотеки. Какие именно библиотеки это будут, я зарание не знаю (буду получать их в виде списка и т.п.)
- Выполнить определённую бизнес логику с помощью этих библиотек
- Вернуться в тело основной программы, предварительно почистив мусор (импортированные библиотеки)
Сейчас я сделал довольно по простому. Т.е. у меня есть некий контекстный менеджер, в который оборачивается код, который подгружает библиотеки и работает с ними. Конт. менеджер "запоминает", что было ДО и после выхода из менеджера пытается вернуть всё так, как было до его запуска.
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')
Но зачем?