Импортировать все из текущего пакета

У меня есть посылка вроде так:

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()
Другие вопросы по тегам