ОК, так что это будет немного сложно объяснить хорошо. Я буду стараться изо всех сил.
Поэтому рассмотрим мою наивную реализацию «загрузки модуля python по имени файла» следующим образом:
def load_module_by_filepath(module_name, module_filepath):
module=None
failure=None
try:
spec = importlib.util.spec_from_file_location(module_name, module_filepath)
module = importlib.util.module_from_spec(spec)
spec.loader.exec_module(module)
except Exception as e:
failure=f"Import of module '{module_name}'from file '{module_filepath}' had errors ({e})"
module=None
return module, failure
Допустим, у меня есть следующий код в файле my_mod.py :
from my_other_mod import something
def somefunc():
something()
Затем я загружаю его, используя мой загрузчик, как это:
module, failure = load_module_by_filepath('my_mod', 'my_mod.py')
В этот момент я смогу вызвать somefunc из моего загруженного модуля вот так:
my_callable = getattr(module, 'somefunc')
my_callable()
Все хорошо, за исключением того, что, если вы внимательно посмотрите, в my_mod.py для что-то от my_other_mod .
Итак, когда я запускаю этот код, я получаю сообщение об ошибке при загрузке модуля со словами «Нет модуля« my_other_mod »».
Я предполагаюэто потому, что my_other_mod был установлен в месте, недоступном для моего недавно загруженного модуля. Они не принадлежат к той же среде или контексту, если хотите.
Поэтому мой вопрос заключается в том, как я могу изменить свой загрузчик, добавив my_other_mod к пути my_mod чтобы он загружался и работал?