2010-11-13 57 views
2

當從PIP到位桶回購安裝django-piston,我發現了一些奇怪的(第一縮進輸出線):Django項目(阿帕奇,mod_wsgi的)不能導入命名空間的包

$ pip install hg+http://bitbucket.org/jespern/django-piston 
Downloading/unpacking hg+http://bitbucket.org/jespern/django-piston 
Cloning Mercurial repository http://bitbucket.org/jespern/django-piston to /tmp/pip-v1h8Sh-build 
Running setup.py egg_info for package from hg+http://bitbucket.org/jespern/django-piston 
Installing collected packages: django-piston 
Running setup.py install for django-piston 
    Skipping installation of [venv]/lib/python2.6/site-packages/piston/__init__.py (namespace package) 
    Installing [venv]/lib/python2.6/site-packages/django_piston-0.2.3rc1-py2.6-nspkg.pth 
Successfully installed django-piston 
Cleaning up 

皮普不會安裝活塞的__init__.py,表明這是因爲'活塞'在setup.py中被指定爲namespace_packages之一。

此外,當我看了「django_piston-0.2.3rc1-nspkg.pth」文件中,我發現這一點,似乎是在「虛擬軟件包」的嘗試:

# File: [virtualenv]/lib/python2.6/site-packages/django_piston-0.2.3rc1-py2.6-nspkg.pth 
# Originally all on one line; broken apart here for readability. 

import sys,new,os; 
p = os.path.join(sys._getframe(1).f_locals['sitedir'], *('piston',)); 
ie = os.path.exists(os.path.join(p,'__init__.py')); 
m = not ie and sys.modules.setdefault('piston',new.module('piston')); 
mp = (m or []) and m.__dict__.setdefault('__path__',[]); 
(p not in mp) and mp.append(p) 

我可以看到它在這裏做什麼;它基本上創建了一個「假模塊」,活塞應該是,它基本上聚集了所有活塞的子模塊。

這似乎對命令行工作正常(我可以從django shell導入活塞[雖然它的repr是<module 'piston' (built-in)>],而且事情似乎在runserver中很好。),但是我的項目運行在apache mod_wsgi上,會在每個頁面上引發500錯誤,因爲有「沒有名爲piston.handler的模塊」。

我排除了python路徑問題; site-packages目錄位於所有嘗試的路徑中。我不知道爲什麼它會有這樣的表現,有什麼想法嗎?

回答

2

尋找一些之後,我發現在the docs for mod_wsgi答案:

另外還有一個步驟然而,在說明中描述的WSGI腳本文件將被修改,以覆蓋虛擬環境之上的應用基準環境。這將通過在WSGI腳本文件最開始的添加來完成下列操作:

import site 
site.addsitedir('/usr/local/pythonenv/PYLONS-1/lib/python2.5/site-packages') 

注意,在這種情況下,需要指定到「站點包」目錄爲虛擬環境中的完整路徑不只是虛擬環境的根源。

使用'site.addsitedir()'與將目錄簡單地添加到'sys.path'有點不同,因爲該函數將打開位於該目錄中的任何'.pth'文件並處理它們。這對確保任何與Python雞蛋相關的特殊目錄自動添加到'sys.path'中是必要的。

添加site.addsitedir調用我的WSGI腳本(到位追加到sys.path的,因爲我一直在做),清理所有問題。