Это расширение вопроса, заданного здесь для динамического выполнения модулей 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 в отдельности. Любые идеи о том, как достичь этого?
Поскольку myapp
- это корневая папка вашего проекта, а не myapp/commands
, вы должны:
from commands import command2
в command1.py
, чтобы интерпретатор смог загрузить command2.py
.
exec(f.read())