(关于SO的其他帖子类似,但没有一个具有uwsgi + Flask + virtualenv的特定组合)(This one is closest)
我通过apt-get安装了uwsgi。我也试过pip install wsgi。两个人都给了我同样的问题。
测试命令:
sudo uwsgi -s /tmp/uwsgi.sock -w myapp:app -H myvirtualenv
结果:
Python version: 2.7.4 (default, Apr 19, 2013, 18:35:44) [GCC 4.7.3]
Set PythonHome to myvirtualenv
ImportError: No module named site
我可以在虚拟环境中运行我的应用程序。
请先查看@JRajan的答案。
如果您确定只想抑制错误而不是实际解决根本问题,则应将--no-site
添加到您的命令或no-site=true
添加到您的uwsgi.ini文件中。
虚拟环境的路径是错误的。这就是造成这个错误的原因。
我正在使用virtualenvwrapper,我的虚拟环境设置在〜/ .virtualenvs。所以在我的情况下,uwsgi调用看起来像
sudo uwsgi -s /tmp/uwsgi.sock -w myapp:app -H ~/.virtualenvs/myapp
希望这有助于下次有人来寻找这个。
感谢Cody在评论中指出它。
在我的情况下,问题是uWSGI试图使用的python版本。
我的项目是用python 3.4编写的,但我没有在uWSGI配置中指定它。所以uWSGI试图使用python 2并尝试从virtualenv中的文件夹lib / python2.7导入模块。
所以我收到了'No module named site'错误,因为所有的模块,包括站点模块,里面的lib / python3.4,而不是lib / python2.7。
为了解决这个问题,我必须做两件事:
apt-get install uwsgi-plugin-python3
plugins = python34
希望这可以帮助将来遇到同样问题的人。
根据要求,这里是我的.ini文件:
[uwsgi]
base = /your/app/path
pythonpath = %(base)
module = your_module_name
callable = app #Here you put the name of the variable which holds your app inside your module
home = /your/virtualenv/path
plugins = python34
master = true
processes = 2
uid = www-data
gid = www-data
socket = /path/to/socket
chmod-socket = 660
die-on-term = true
logto = /var/log/uwsgi/%n.log
我以前遇到过类似的问题。我的问题是我的ubuntu系统上有python2.x和python3.x,我希望我的项目在安装了python3环境的虚拟环境中运行。我是如何解决这个问题的:
apt-get install python3-pip
pip3安装uWSGI
就这样。
如果您的虚拟环境在Python3上运行,那么您必须使用pip3安装uwsgi,而不是pip否则,版本不匹配会产生此导入问题
pip uninstall uwsgi
pip3 install uwsgi
出于几个原因,这可能是因为安全而导致的。它适用于测试。但是在生产中使用这种精确的解决方案之前,请先检查一下安全性
可能发生此错误的另一个原因是权限相关。如果是using an .ini file as described in the official tutorial for uWSGI for django,您可能已经创建了一个用户和组的ini文件,该文件使得正在运行该进程的用户无法访问该文件。
检查文件的所有者和权限及其所在的目录路径。使用chown和chmod设置所需的权限。
sudo chown -R www-data:www-data /srv
sudo chmod 0775 -R /srv
在我的情况下,我使用一个流浪盒进行测试,默认用户是“vagrant”,而nginx正在为用户和组使用www-data。我已将项目中所有文件的所有者设置为www-data用户和组,并将vagrant用户添加到www-data组。
sudo gpasswd -a vagrant www-data
我不确定这是否是一种良好的安全措施,所以当我将它投入生产时,我将与我的系统管理员合作。但对于我的测试环境,它可以工作。无论哪种方式,许多这些问题都需要仔细查看权限。
我遇到了同样的问题,我的问题是运行uwsgi的python版本。 uwsgi在python2上运行但我的virtualenv python路径设置为python3。这造成了冲突,它无法找到已安装的站点包。
仔细检查运行uwsgi的python版本,以便它与virtualenv上设置的相同。
当我的自制软件将我的Python版本更新为Python 3.7并且它停止工作时,我遇到了这个问题。对我有用的是brew info python
- 它将向您展示所有可用的Python版本。比我使用brew switch python 3.6.5
回滚到Python 3.6.5。
之后我简单地重新安装了我的uWSGI:
pip3 uninstall uwsgi
pip3 install uwsgi
这解决了它。如果您不确定您使用的是哪个版本的Python,brew info python
会向您显示安装日期。此外,如果为当前版本安装了uWSGI,则可以使用pip3 list
进行检查。
希望这可以帮助!