我正在開發一個python框架,將「附加」作爲單獨的包編寫。即:將單獨的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
)。
解決方法是在中有額外的代碼,它會通過sys.path
來查找任何帶有myframework子包的模塊,在這種情況下,它會將其添加到sys.path
並且一切正常。
我的另一個想法是直接將插件文件寫入myframework/addons/
安裝位置,但這樣會使開發和部署的名稱空間不同。
有沒有更好的方法來完成這個或者完全不同的方法來解決上述分配問題?
請參閱下面的亞歷克的答案。 Setuptools有這方面的東西,稱爲entry_points。 – 2014-12-28 22:33:25