Динамически загружать и выполнять модули Python изолированно

1

Это расширение вопроса, заданного здесь для динамического выполнения модулей python

Импорт динамического модуля в Python

Хотя консенсус, похоже, заключается в использовании import или importlib для выполнения динамической загрузки/выполнения модулей python, это решение имеет тенденцию разрушаться, когда у вас есть дополнительный импорт, определенный внутри динамически загружаемого модуля.

Возьмем исходный пример

myapp/
    __init__.py
    commands/
        __init__.py
        command1.py
        command2.py
    foo.py
    bar.py

Если command1.py импортирует command2.py, то при попытке динамически загрузить command1.py с помощью importlib или импортировать его не удастся с

ModuleNotFoundError: Нет модуля с именем 'command2'

Теперь я могу обойти это, добавив каталог команд в sys.path, но это будет загрязнять глобальное пространство имен. Это может стать еще более проблематичным, если имеется несколько команд с различными зависимостями библиотеки сторонних сторон. Одна команда может зависеть от другой версии установленной библиотеки, чем другая.

Поэтому, в сущности, я ищу способ динамически загружать/выполнять модуль python в отдельности. Любые идеи о том, как достичь этого?

  • 0
    exec(f.read())
  • 0
    Чем exec отличается от importlib? Разве это не столкнется с теми же проблемами?
Теги:
python-3.x

1 ответ

0

Поскольку myapp - это корневая папка вашего проекта, а не myapp/commands, вы должны:

from commands import command2

в command1.py, чтобы интерпретатор смог загрузить command2.py.

Ещё вопросы

Сообщество Overcoder
Наверх
Меню