Python uwsgi&x2B;烧瓶+;virtualenv ImportError:没有名为site的模块

Python uwsgi&x2B;烧瓶+;virtualenv ImportError:没有名为site的模块,python,flask,virtualenv,uwsgi,Python,Flask,Virtualenv,Uwsgi,(SO上的其他帖子类似,但都没有uwsgi+Flask+virtualenv的具体组合)() 我通过apt get安装了uwsgi。我还尝试了pip安装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

(SO上的其他帖子类似,但都没有uwsgi+Flask+virtualenv的具体组合)()

我通过apt get安装了uwsgi。我还尝试了pip安装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的答案。


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

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

我正在使用VirtualNVRapper,我的虚拟环境设置为~/.virtualNVs。所以在我的情况下,uwsgi呼叫看起来像

sudo uwsgi -s /tmp/uwsgi.sock -w myapp:app -H ~/.virtualenvs/myapp
希望下次有人来找这个时,这个能帮上忙


多亏Cody在评论中指出了这一点。

出于几个原因,这可能会对安全性造成不利影响。它用于测试。但在生产中使用此精确解决方案之前,请检查安全性

发生此错误的另一个原因是权限相关。如果是,您可能已使用用户和组创建了ini文件,从而使运行进程的用户无法访问该文件

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

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

sudo chmod 0775-R/srv

在我的例子中,我使用了一个vagrant框进行测试,默认用户是“vagrant”,而nginx使用的是用户和组的www数据。我已将项目中所有文件的所有者设置为www数据用户和组,并将流浪用户添加到www数据组

sudo gpasswd-一个流浪的www数据


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

在我的例子中,问题是uWSGI试图使用的python版本

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

所以我收到了“No module named site”错误,因为所有模块,包括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

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

apt获取并安装python3 pip

pip3安装uWSGI


仅此而已。

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


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

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

pip uninstall uwsgi    
pip3 install uwsgi

当我的自制软件将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列表检查


希望这有帮助

@hughes顺便问一下,“--no site”是什么意思?uwsgi-help | grep“no-site”产生--no site不导入site模块”。uWsgi文档也没有多大帮助:我怀疑这是否真的解决了您的问题。“未命名模块…”导入错误通常意味着uwsgi没有到virtualenv的正确路径。无站点标志将阻止virtualenv加载站点包。因此,您不会再收到错误,但uwsgi也无法访问您的python virtualenv或任何站点包。检查你的路径!编辑:为后代发布。我昨天花了8个小时在这个…@mapcuk@wes上,我很确定
--没有站点
引用内部python site.py模块,您可以通过运行:
python-c“导入站点;打印站点.\uu文件”
来查看此模块的位置。它包含关于全局python安装的信息。不包括它将意味着你完全依赖于虚拟电视。他说,抑制而不是解决问题!谢谢这对我今天很有帮助:)你是生命的救世主。感谢budythanks,
home
config应该是virtualenv路径,但我编写了虚拟环境python位置。这个.ini配置文件在哪里?@luislhl我添加了
plugin=python34
,但是
uwsgi.log
仍然返回
python版本:2.7.6(默认,2016年10月26日,20:33:43)[GCC 4.8.4]将PythonHome设置为/home/rootadmin/.virtualenvs/data\u collection导入错误:没有名为site的模块
@MitchellvanZuylen,可能是b