同一個uwsgi Emperor下的不同Python版本?
我正在執行一個帶有各種 Vassal 的 uwsgi Emperor,每個 Vassal 都為來自不同 virtualenv 的特定 Python 應用程序提供服務。由於 uwsgi 是使用它自己的 Python 2.7 解釋器編譯的,因此嘗試在其中使用帶有 Python 3 的 virtualenv 會在 vassal.log 中產生以下錯誤:
ImportError: No module named site
我相信這個錯誤的根源是 uwsgi 正在使用其內置的 Python 2.7 解釋器,而它執行的 virtualenv 目錄僅支持 Python 3 解釋器。實際上,當我使用另一個 uwsgi(只需將其安裝
pip install uwsgi
在同一個 virtualenv 中)時,錯誤就會消失。但是,我希望一個皇帝統治幾個不同的虛擬環境,所以在每個虛擬環境中安裝一個單獨的 uwsgi 不是一種選擇。根據Stackoverflow 上的這個答案,解決這個問題的正確方法是使用不同的 Python 解釋器編譯 uwsgi 作為可載入模組。在我採用這種方法之前,我想知道如何將我的 Vassals 配置為每個使用另一個解釋器外掛。
現在我有一個從我的 /etc/rc.local 啟動的 Emperor 並具有以下設置:
[uwsgi] uid = www-data gid = www-data master = true emperor = /etc/uwsgi/vassals daemonize = /var/log/uwsgi/emperor.log
然後我有一堆帶有這樣的ini文件的Vassal:
[uwsgi] master = false single-interpreter = true socket = /tmp/%n.sock virtualenv = /home/user/.virtualenvs/djangoproject chdir = /home/user/djangoproject wsgi-file = project/wsgi.py logto = /var/log/uwsgi/%n.log
我用幾個解釋器外掛編譯 uwsgi 的調整版本沒有問題,但我想知道我必須在配置中更改什麼才能實際使用這些單獨的解釋器。我可以說一個vassal.ini:
plugin = python3.4
在另一個:
plugin = python2.7
?
請幫我弄清楚如何在同一個 uwsgi Emperor 下結合 Python 2.7 和 Python 3 virtualenvs。
好吧,由於我並沒有完全被回复所淹沒,所以這是我自己想出的解決方案:
首先,我使用 Python 3 解釋器創建了一個新的 virtualenv:
mkvirtualenv -p /usr/bin/python3 python3env
然後我從 Pypi 安裝了股票 uwsgi,它使用 Python 3 解釋器自動編譯:
pip install uwsgi
我創建了一個包含 Emperor.ini 的配置目錄
/etc/uwsgi-python3
和一個包含 vassal.ini 的子目錄 vassals。最後,我將以下行添加到/etc/rc.local
/home/user/.virtualenvs/python3env/bin/uwsgi --ini /etc/uwsgi-python3/emperor.ini
現在有一個 uwsgi Emperor 正在執行,它使用 Python 3 解釋器作為它的附庸。它不會干擾另一個已經在執行並使用 Python 2.7 解釋器的 uwsgi Emperor。
我知道這不是最優的,因為我沒有使用文件中解釋的可插入解釋器架構(感謝 roberto!我不知道我怎麼能忽略這一點)。但是,它執行完美,我不必碰我現有的為大量生產應用程序提供服務的 uwsgi 安裝。