2012-06-28 22 views
3

我遇到了python namespaced包的問題,​​並且想知道什麼是一個好的解決方案。用Python命名空間包進行開發

我的項目結構類似於以下

project_name/ext/app_ext 

這就是我工作的項目。它的依賴關係也在同一個命名空間中。

project_name/ext/base_ext 
project_name/ext/other_dependency 

我正在使用django應用程序中的「app_ext」命名空間包。但是,我遇到了收到no module named app_ext的問題。

我認爲它與如何安裝依賴名稱空間包(我正在使用PIP進行安裝)有關。依賴項名稱空間包不與0123/文件一起安裝,正如在distributed/setuptools文檔中所記錄的,但它們的安裝包中都包含以下聲明。

from pkgutil import extend_path 
__path__ = extend_path(__path__, __name__) 

現在到了真正的問題。當已經安裝了一些相關的命名空間軟件包時,有沒有一種方法可以使用命名空間包?

+0

難道你不能在包目錄中包含空的'__init __。py'文件嗎? – JAB

+0

@JAB你是否建議他在project_name中手動添加__init __。py'文件,並在site-packages中擴展虛擬包目錄? –

+0

如果問題是軟件包沒有被識別,那麼應該可以工作,對嗎?由於'__init __。py'實際上不需要包含任何東西來做它的工作,因爲包含它的目錄是一個包。或者也許我在這裏錯過了一些東西,考慮到當軟件包本質上是名稱空間的時候,術語「名稱空間包」的用法。 PIP是否會執行一些魔法來防止在安裝的軟件包中的其他文件中添加文件? – JAB

回答

0

一種解決方法是修改名稱空間包的路徑以添加本地路徑。 (如果你在Django中工作,你可以在你的settings.py文件中添加下面的代碼片段)。

from os import path 
import sys 

PACKAGE_NAMESPACE = ["project_name", "ext"] 
VIRTUAL_PACKAGE = '.'.join(PACKAGE_NAMESPACE) 
__import__(VIRTUAL_PACKAGE) 
local_package = path.abspath(path.join(*PACKAGE_NAMESPACE)) 
sys.modules[VIRTUAL_PACKAGE].__dict__["__path__"].insert(0, local_package) 

這種方法也用在tiddlyweb項目的tiddlywebplugins命名空間。

+0

,這感覺很奇怪,但似乎工作,並不是一個非常侵入性的變化。謝謝你的幫助。 – Aaron