从当前包导入所有内容

时间:2015-10-18 19:16:42

标签: python

我有一个像这样的包:

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 个答案:

答案 0 :(得分: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()