[英]Django/Apache/mod_wsgi not using virtualenv's Python binary
我在 /opt/webapps/ff/ 有一個 virtualenv,它有自己的 Python 安裝。 我在我的 Apache 配置文件中將 WSGIPythonHome 設置為 /opt/webapps/ff(這肯定會在某些容量中使用,因為如果我將其設置為稍微不同的現有目錄並重新啟動 Apache 我會得到 504)。 但是,如果我在某個視圖中assert False
以調出 Django 調試頁面,我會看到 settings.PYTHON_BIN 是/usr/bin
而不是/opt/webapps/ff/bin
。
如何讓 Apache/mod_wsgi 使用我的虛擬環境的 Python 二進制文件? 我認為設置 WSGIPythonHome 是這樣做的方法,但它似乎只影響使用哪個站點包目錄,而不影響使用哪個二進制文件。 謝謝。
這些是我使用的指令,似乎運行良好。
http://code.google.com/p/modwsgi/wiki/VirtualEnvironments
使用 'site.addsitedir()' 與簡單地將目錄添加到 'sys.path' 有點不同,因為 function 將打開目錄中的任何 '.pth' 文件並處理它們。 這是確保任何與 Python 雞蛋相關的特殊目錄自動添加到“sys.path”的必要條件。
請注意,盡管 virtualenv 包含腳本 'activate_this.py',virtualenv 文檔聲稱應在 mod_wsgi 的上下文中使用 'execfile()' 調用該腳本,但您可能需要謹慎使用它。 這是因為腳本修改了“sys.prefix”,如果代碼依賴於“sys.prefix”的值不變,這實際上可能會導致已經加載到 Python 解釋器中的 mod_wsgi 或 Python 模塊的操作出現問題。 如果想要將 Python 作為一個整體與虛擬環境相關聯,則應該使用已經描述的 WSGIPythonHome 指令。
盡管如此,“activate_this.py”腳本試圖解決“site.addsitedir()”如何工作的問題。 也就是說,由 'site.addsitedir()' 添加到 'sys.path' 的任何新目錄實際上都附加到末尾。 在 mod_wsgi 上下文中的問題在於,如果不使用 WSGIPythonHome 將 mod_wsgi 與原始基線環境相關聯,那么主 Python 安裝中的任何包/模塊仍將優先於虛擬環境中的那些。
為了解決這個問題,'activate_this.py' 所做的是調用 'site.addsitedir()' 但隨后也會重新排序 'sys.path' 以便任何新添加的目錄都轉移到 'sys.path' 的前面。 這將確保在虛擬環境中存在不同版本的軟件包時,它們優先於主 Python 安裝中的軟件包。
正如所解釋的,因為 'activate_this.py' 正在做其他可能不適合 mod_wsgi 上下文的事情,如果無法將 WSGIPythonHome 設置為將 mod_wsgi 指向原始基線環境,而不是僅僅調用 'site.addsitedir()' 你應該使用代碼:
ALLDIRS = ['usr/local/pythonenv/PYLONS-1/lib/python2.5/site-packages']
import sys
import site
# Remember original sys.path.
prev_sys_path = list(sys.path)
# Add each new site-packages directory.
for directory in ALLDIRS:
site.addsitedir(directory)
# Reorder sys.path so new directories at the front.
new_sys_path = []
for item in list(sys.path):
if item not in prev_sys_path:
new_sys_path.append(item)
sys.path.remove(item)
sys.path[:0] = new_sys_path
如果您仍想使用 virtualenv 中的激活腳本,請使用:
activate_this = '/usr/local/pythonenv/PYLONS-1/bin/activate_this.py'
execfile(activate_this, dict(__file__=activate_this))
如果 'sys.prefix' 已被修改的事實不會產生問題,那就太好了。 如果您看到可能與更改“sys.prefix”有關的細微無法解釋的問題,請使用上述更長期的方法,即直接使用“site.addsitedir()”並隨后重新排序“sys.path”。
這里也是關於這個問題的討論
http://groups.google.com/group/modwsgi/browse_thread/thread/466823f087070b5f?pli=1
我在 Pylons 應用程序中遇到了同樣的情況,最終改用/usr/bin
二進制文件加上virtualenv site-packages 目錄。
當然是同一個 python 版本...
如果您使用的是 virtualenv,則需要確保在 WSGI 腳本中激活它。
venv_path = "/opt/webapps/ff"
activate_this = os.path.join(venv_path, "bin/activate_this.py")
execfile(activate_this, dict(__file__=activate_this))
在 virtualenv 中安裝 modoboa(基於 django)時遇到了同樣的問題。
我花了很多時間才找到一個明確的答案,所以我會在這里發布。
我需要做的就是在通用的 apache conf 文件(CentOS 中的 /etc/httpd/conf/httpd.conf)中添加兩行:
WSGISocketPrefix /var/run/wsgi ## (location for the PID)
WSGIPythonHome /path/to/virtualenv
並重啟 Apache
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.