Установить путь динамически загружаемого модуля в Python 3.7 - PullRequest
1 голос
/ 02 октября 2019

ОК, так что это будет немного сложно объяснить хорошо. Я буду стараться изо всех сил.

Поэтому рассмотрим мою наивную реализацию «загрузки модуля 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 чтобы он загружался и работал?

...