20

(SO上的其他帖子类似,但没有一个有uwsgi + Flask + virtualenv的具体组合)(这个最接近

我通过 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

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

4

8 回答 8

24

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

我正在使用 virtualenvwrapper,我的虚拟环境设置在 ~/.virtualenvs。所以就我而言, uwsgi 调用看起来像

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

希望下次有人来找这个时这会有所帮助。

感谢 Cody 在评论中指出这一点。

于 2015-03-08T04:19:45.670 回答
21

首先查看@JRajan 的答案。

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

于 2013-10-16T14:49:11.393 回答
15

就我而言,问题是 uWSGI 尝试使用的 python 版本。

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

所以我收到了“没有名为站点的模块”错误,因为所有模块,包括站点模块,都在 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
于 2017-01-25T19:10:32.183 回答
8

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

apt-get 安装 python3-pip

pip3 安装 uWSGI

就这样。

于 2017-02-10T09:54:54.970 回答
4

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

pip uninstall uwsgi    
pip3 install uwsgi
于 2017-12-18T17:33:32.007 回答
1

出于多种原因,这可能对安全性不利。它适用于测试。但在生产中使用此精确解决方案之前,请检查安全性

可能发生此错误的另一个原因是权限相关。如果使用 .ini 文件,如 uWSGI for django 官方教程中所述,您可能已经使用用户和组创建了 ini 文件,这使得运行该进程的用户无法访问该文件。

检查文件的所有者和权限以及它所在的目录路径。使用 chown 和 chmod 设置所需的权限。

sudo chown -R www-data:www-data /srv

sudo chmod 0775 -R /srv

就我而言,我使用 vagrant box 进行测试,默认用户是“vagrant”,而 nginx 使用 www-data 作为用户和组。我已将项目中所有文件的所有者设置为 www-data 用户和组,并将 vagrant 用户添加到 www-data 组。

sudo gpasswd -a vagrant www-data

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

于 2016-08-04T14:29:29.413 回答
1

当我的自制程序将我的 Python 版本更新到 Python 3.7 并且它停止工作时,我遇到了这个问题。对我有用的是brew info python- 这将向您展示所有可用的 Python 版本。比我回滚到 Python 3.6.5 使用brew switch python 3.6.5.

之后,我只是使用以下命令重新安装了我的 uWSGI:

pip3 uninstall uwsgi
pip3 install uwsgi

这解决了它。如果您不确定您使用的是哪个版本的 Python,请brew info python向您显示安装日期。此外,您可以检查pip3 list是否为当前版本安装了 uWSGI。

希望这可以帮助!

于 2018-10-24T11:11:45.150 回答
0

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

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

于 2017-10-25T14:48:33.017 回答