Импортировать все из текущего пакета
У меня есть посылка вроде так:
lib/
__init__.py
package/
__init__.py
module1.py
module2.py
framework.py
мой __init__.py
имеет такую структуру:
__all__ = ['module1', 'module2']
def run_all():
for module in __all__:
eval(module).Bot().start()
Каждый модуль представляет собой небольшую программу, которая будет запускаться из более крупного run_all()
Функция была создана, чтобы легко сделать это.
Если я импортирую каждый модуль по отдельности, вот так:
from lib.package import module1
from lib.package import module2
все работает как надо. Хотя, если я попытаюсь импортировать все:
from lib.package import *
или даже так:
from . import *
Я получаю NameError, что пакет не определен.
Как я могу импортировать модули внутри пакета для run_all()
работать?
РЕДАКТИРОВАТЬ
Когда я добавлю from . import *
или же from lib.package import *
в module.__init__.py
(или вообще ничего) Я получаю эту ошибку:
Traceback (most recent call last):
File "./main.py", line 64, in <module>
Bot().start()
File "./main.py", line 45, in start
package.run_all()
File "/home/bkvaluemeal/Documents/bot/lib/package/__init__.py", line 16, in run_all
eval(module).Bot().start()
File "<string>", line 1, in <module>
NameError: name 'module1' is not defined
1 ответ
Проблема с вашей функцией run_all. Перебирает список строк (__all__
) и пытается их оценить. Вы можете захотеть использовать __import__
или же import_module
вместо этого (сам не тестировал приведенный ниже код, но он должен работать) ...
def run_all():
for module in __all__:
mod = __import__("lib.package", globals(), locals(), [module], -1))
getattr(mod, module).Bot().start()
или же
import importlib
def run_all():
for module in __all__:
mod = importlib.import_module("lib.package.{}".format(module))
mod.Bot().start()