我有一个像这样的包:
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
答案 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()