我正在开发一个 python 框架,它将“插件”编写为单独的包。IE:
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/
安装位置,但这会使开发和部署的命名空间有所不同。
有没有更好的方法来实现这一点,或者完全可以用不同的方法来解决上述分布问题?