2015-10-18 3 views
0

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

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()?

EDIT

Когда я добавляю 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 
+0

Пожалуйста, покажите нам точный текст Ошибка. – Kevin

+0

'Traceback (самый последний вызов последнего): Файл "./master.py", строка 64, в Bot() начать() File "./master.py", строка 45, в начальном пакете. .run_all() Файл «/home/bkvaluemeal/Documents/bot/lib/package/__init__.py», строка 16, в run_all eval (module) .Bot ​​(). start() Файл «», строка 1, in NameError: name 'module1' не определен' – bkvaluemeal

+1

Это исключение (которое действительно должно быть отредактировано в вопросе, а не неформатировано в комментарии) происходит, когда вы вообще не импортируете подмодули (что неудивительно). Можете ли вы показать исключение, которое вы получите, если будете делать. import * 'или' из lib.package import * '? – Blckknght

ответ

0

проблема с вашей функцией 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() 
+0

Как это работает? – bkvaluemeal

+0

Я отредактировал свой ответ – Ofir

+0

Я все еще получаю ту же ошибку. Возможно, мой путь к файлу неправильный? Я заметил, что импорт ведет себя как в том же каталоге, что и вызывающий класс. Импортируется __import__ из '/ home/bkvaluemeal/Documents/bot' или'/home/bkvaluemeal/Documents/bot/lib/package'. – bkvaluemeal

Смежные вопросы