[英]Import all from current package
我有一個像這樣的包裹:
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 . import *
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
問題出在您的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()
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.