我正在开发一个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
这将tranverse sys.path
,寻找与myframework子包,在这种情况下将其添加到任何模块sys.path
和一切正常.
我的另一个想法是直接编写addon文件来myframework/addons/
安装位置,但是它会使开发和部署的命名空间不同.
是否有更好的方法来实现这一点,或者可能采用不同的方法解决上述分配问题?
请参阅名称空间包
http://www.python.org/dev/peps/pep-0382/
或者在setuptools中:
http://peak.telecommunity.com/DevCenter/setuptools#namespace-packages