uwsgi + Flask + virtualenv ImportError:没有名为site的模块

问题描述 投票:17回答:8

(关于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

我可以在虚拟环境中运行我的应用程序。

python flask virtualenv uwsgi
8个回答
22
投票

请先查看@JRajan的答案。

如果您确定只想抑制错误而不是实际解决根本问题,则应将--no-site添加到您的命令或no-site=true添加到您的uwsgi.ini文件中。


23
投票

虚拟环境的路径是错误的。这就是造成这个错误的原因。

我正在使用virtualenvwrapper,我的虚拟环境设置在〜/ .virtualenvs。所以在我的情况下,uwsgi调用看起来像

sudo uwsgi -s /tmp/uwsgi.sock -w myapp:app -H ~/.virtualenvs/myapp

希望这有助于下次有人来寻找这个。

感谢Cody在评论中指出它。


13
投票

在我的情况下,问题是uWSGI试图使用的python版本。

我的项目是用python 3.4编写的,但我没有在uWSGI配置中指定它。所以uWSGI试图使用python 2并尝试从virtualenv中的文件夹lib / python2.7导入模块。

所以我收到了'No module named site'错误,因为所有的模块,包括站点模块,里面的lib / python3.4,而不是lib / python2.7。

为了解决这个问题,我必须做两件事:

  • 安装uWSGI的python3插件,包括: apt-get install uwsgi-plugin-python3
  • 在.ini配置文件中使用它,包括: 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

8
投票

我以前遇到过类似的问题。我的问题是我的ubuntu系统上有python2.x和python3.x,我希望我的项目在安装了python3环境的虚拟环境中运行。我是如何解决这个问题的:

apt-get install python3-pip

pip3安装uWSGI

就这样。


4
投票

如果您的虚拟环境在Python3上运行,那么您必须使用pip3安装uwsgi,而不是pip否则,版本不匹配会产生此导入问题

pip uninstall uwsgi    
pip3 install uwsgi

1
投票

出于几个原因,这可能是因为安全而导致的。它适用于测试。但是在生产中使用这种精确的解决方案之前,请先检查一下安全性

可能发生此错误的另一个原因是权限相关。如果是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

我不确定这是否是一种良好的安全措施,所以当我将它投入生产时,我将与我的系统管理员合作。但对于我的测试环境,它可以工作。无论哪种方式,许多这些问题都需要仔细查看权限。


0
投票

我遇到了同样的问题,我的问题是运行uwsgi的python版本。 uwsgi在python2上运行但我的virtualenv python路径设置为python3。这造成了冲突,它无法找到已安装的站点包。

仔细检查运行uwsgi的python版本,以便它与virtualenv上设置的相同。


0
投票

当我的自制软件将我的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进行检查。

希望这可以帮助!

© www.soinside.com 2019 - 2024. All rights reserved.