【发布时间】:2012-04-03 06:20:48
【问题描述】:
在我正在开发的 python 应用程序中,我想根据运行时提供的信息(例如来自配置文件)动态加载包(插件)。
所以,我更改 sys.path 以添加要加载的插件的路径,这通常可以正常工作,但如果插件是已初始化的命名空间内的命名空间包(我认为这是问题所在)无论如何)。
例子:
# lib1 contains plugins/__init__.py and plugins/foo/__init__.py
# lib2 contains plugins/__init__.py and plugins/bar/__init__.py
# plugins is a namespace package
import sys
sys.path.append ('lib1')
import plugins.foo
sys.path.append ('lib2')
import plugins.bar
上述代码因 ImportError 失败,可能是因为“import plugins.foo”行初始化了插件命名空间/包,并且没有进一步尝试在 sys.path 中搜索命名空间中的其他包。
如果我把代码改成这样:
sys.path.append ('lib1')
sys.path.append ('lib2')
import plugins.foo
import plugins.bar
两种导入都有效,但我想在 plugins.foo 导入之后添加到 sys.path。
所以,我的问题是:
- 我的假设是否正确,即第二次导入失败是因为 命名空间包?
- 有解决方法吗?
【问题讨论】:
-
你真的不需要弄乱 sys.path 。只需使用软件包。对于动态导入,您可以调用
__import__函数。或者使用imp模块。 -
如果我的操作正确,为什么不直接将
plugins制作成一个包并将plugins/lib1和plugins/lib2添加到路径中,然后将import foo和import bar添加到路径中? -
也就是说,我认为您真正的问题是如何在 Python 中制作插件系统 - 请参阅:stackoverflow.com/questions/7417997/plugin-manager-in-python/…
标签: python python-2.6 import