【发布时间】:2010-10-02 01:35:32
【问题描述】:
我正在开发一个 python 框架,它将“插件”编写为单独的包。即:
import myframework
from myframework.addons import foo, bar
现在,我正在尝试安排这些插件可以与核心框架分开分发并注入myframework.addons 命名空间。
目前我对此的最佳解决方案如下。将部署一个附加组件(很可能像这样部署到{python_version}/site-packages/:
fooext/
fooext/__init__.py
fooext/myframework/
fooext/myframework/__init__.py
fooext/myframework/addons/
fooext/myframework/addons/__init__.py
fooext/myframework/addons/foo.py
fooext/myframework/addons/__init__.py 将具有 pkgutil 路径扩展代码:
import pkgutil
__path__ = pkgutil.extend_path(__path__, __name__)
问题在于,要使其正常工作,PYTHONPATH 需要在其中包含 fooext/,但它唯一拥有的是父安装目录(很可能是上面提到的 site-packages)。
解决方案是在 myframework/addons/__init__.py 中添加额外的代码,该代码将遍历 sys.path 并查找带有 myframework 子包的任何模块,在这种情况下,它将其添加到 sys.path 并且一切正常。
我的另一个想法是将插件文件直接写入myframework/addons/ 安装位置,但这会使开发和部署的命名空间有所不同。
有没有更好的方法来完成这个,或者完全可以用不同的方法来解决上述分布问题?
【问题讨论】:
标签: python namespaces distribution extend