簡體   English   中英

Django/Apache/mod_wsgi 不使用 virtualenv 的 Python 二進制文件

[英]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.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM