我想知道如何使用virtualenv在uWSGI中運行Flask Web應用程序。我有一個uWSGI的全局安裝,Flask在我的項目的虛擬環境目錄中安裝了pip。爲什麼uWSGI無法找到Flask的functools模塊?
在皇帝模式啓動uwsgi
當我收到以下錯誤:
Traceback (most recent call last):
File "/var/www/myapp/MyModule/__init__.py", line 1, in <module>
from flask import Flask
File "/var/www/myapp/environment/lib/python2.7/site-packages/flask/__init__.py", line 17, in <module>
from werkzeug.exceptions import abort
File "/var/www/myapp/environment/lib/python2.7/site-packages/werkzeug/__init__.py", line 20, in <module>
from werkzeug._compat import iteritems
File "/var/www/myapp/environment/lib/python2.7/site-packages/werkzeug/_compat.py", line 3, in <module>
import functools
ImportError: No module named functools
我emperor.ini文件看起來像這樣:
[uwsgi]
daemonize = /var/log/uwsgi/emperor.log
touch-logreopen = /etc/uwsgi/logrotate.trigger
emperor = /etc/uwsgi/apps-enabled
pidfile = /var/run/uwsgi/emperor.pid
die-on-term = true
我的/ etc/uwsgi/apps-available/myapp.ini文件看起來像這樣:
[uwsgi]
socket = 127.0.0.1:9000
wsgi-file = /var/www/myapp/MyModule/__init__.py
virtualenv = /var/www/myapp/environment/
pythonpath = /var/www/myapp/environment/lib/python2.7/site-packages
pythonpath = /var/www/myapp/MyModule/
callable = app
no-site = True
processes = 4
threads = 2
logto = /var/log/uwsgi/myapp.log
該文件被鏈接到/etc/uwsgi/apps-enabled/myapp.ini
爲了完整起見,我使用systemd管理在Debian 7.7的服務,我的啓動文件看起來是這樣的:
[Unit]
Description=uWSGI Emperor
After=syslog.target
[Service]
ExecStart=/usr/local/bin/uwsgi --emperor /etc/uwsgi/apps-enabled --uid www-data --gid www-data
Restart=always
KillSignal=SIGQUIT
Type=notify
StandardError=syslog
NotifyAccess=all
[Install]t
WantedBy=multi-user.target
我曾嘗試:
- 在皇帝模式下運行得到了同樣的錯誤,如皇帝模式下運行
- 使用瓶的嵌入式服務器,這實際上工作得很好
- 在虛擬環境中,它產生的錯誤,它無法加載不同模塊
- 重建VM的python 2.7和python 3.2之間切換,重新安裝Debian的,其次詳細的nginx + uwsgi +燒瓶導向
- 運行不使用的燒瓶中,一個基本的hello world一個應用程序,它在不改變uwsgi或nginx的配置
- 更改MYAPP.INI使用,並且也省略
no-site
工作得很好;省略它會導致有關無法加載一個模塊命名的網站 - 使用MYAPP.INI模塊聲明,像這樣的錯誤:模塊= MyModule的:應用程序,同樣的問題
- 改變了應用程序的目錄結構,最初使用WSGI的.py外面模塊目錄(/var/www/myapp/wsgi.py)
- 在網上淘的答案超過7小時了
我該如何解決這個問題呢?
編輯1
我還在就這個問題和我已經刪除了no-site
選項,但一直沒能得到它超越運行。我最初認爲它可能是一個權限問題,從不同的用戶創建virtualenv,但在運行chown後,它仍然顯示錯誤ImportError:沒有名爲站點的模塊。
我也嘗試創建一個簡單的hello world燒瓶應用程序,並把我的你好。py文件在virtualenv目錄中,因爲我在論壇上看到了這個建議,但沒有任何幫助。我設置了no-site = True
,我仍然看到ImportError:沒有名爲flask的模塊。不過,通過激活virtualenv並使用內置的Web服務器運行python hello.py
,應用程序仍能正常運行。
除非你知道你在做什麼,否則絕對不要使用no-site。檢查uWSGI使用的python版本(它是在初始日誌中打印的),它必須與virtualenv相同。如果它們不同,你將得到站點模塊錯誤(這是混合環境時的標準python行爲) – roberto
@roberto我激活virtualenv和「linux2上的Python 2.7.3 [GCC 4.7.2]」。我關閉了virtualenv,它和時間戳完全一樣。但是,我確實注意到uWSGI說了一些喜歡混合解釋模式的東西。系統安裝了幾個不同版本的Python,但在virtualenv中運行的版本是系統的默認版本。我還用'-p/usr/bin/python2'創建了virtualenv,它鏈接到python2.7。我原本以爲是這樣,這將是一個簡單的解決方案。我只使用無站點,因爲它至少得到了Flask的代碼庫。 –
激活/關閉venv是無用的(它只在當前會話中設置環境變量)。 uWSGI照顧它。請檢查uWSGI使用的python版本,它必須與您的virtualenv相同。 – roberto