Привет, ребят.
Я пытаюсь найти +- похожее или готовое решения в работающих/open_source проектах для моей проблемы
У меня сейчас стоит задачка разработать (написать) модуль, который должен делать следующее:
1) В основной (главной) программе с помощью "ново-написанного" модуля подгрузить (динамически импортировать) библиотеки. Какие именно библиотеки это будут, я зарание не знаю (буду получать их в виде списка и т.п.)
2) Выполнить определённую бизнес логику с помощью этих библиотек
3) Вернуться в тело основной программы, предварительно почистив мусор (импортированные библиотеки)
Сейчас я сделал довольно по простому. Т.е. у меня есть некий контекстный менеджер, в который оборачивается код, который подгружает библиотеки и работает с ними.
Конт. менеджер "запоминает", что было ДО и после выхода из менеджера пытается вернуть всё так, как было до его запуска.
Shut up and show the f*ckin' 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
Если дочитали, СПАСИБО =)