以下是一个对我有效的方法。 创建一个新的子模块 < code>all. py code>, 例如, 在命名空间中的一个软件包中 。
如果您写了
import mynamespace.all
您被给定了 mynamespace
模块的对象。 此对象包含名称空间中所有已装入的模块, 无论它们在哪里被装入, 因为周围只有一个 mynamespace
实例。
所以,只需在命名空间中以 all.py
格式装入所有包!
# all.py
from pkgutil import iter_modules
# import this module s namespace (= parent) package
pkg = __import__(__package__)
# iterate all modules in pkg s paths,
# prefixing the returned module names with namespace-dot,
# and import the modules by name
for m in iter_modules(pkg.__path__, __package__ + . ):
__import__(m.name)
或者在让 all
模块保持空白的单行线中,如果你关心的是这种事情:
# all.py
(lambda: [__import__(_.name) for _ in __import__( pkgutil ).iter_modules(__import__(__package__).__path__, __package__ + . )])() # noqa
从您的命名空间导入 all
模块后, 您实际上会收到一个满载的命名空间模块 :
import mynamespace.all
mynamespace.mymodule1 # works
mynamespace.mymodule2 # works
...
当然,如果您不想立即导入,您可以使用相同的机制在命名空间中列出模块或以其他方式处理模块。