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

时间:2013-06-30 14:53:49

标签: python flask virtualenv uwsgi

(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

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

8 个答案:

答案 0 :(得分:23)

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

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

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

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

感谢Cody在评论中指出它。

答案 1 :(得分:21)

首先查看@JRajan的答案。

如果您确定只想压制错误而不是解决潜在问题,则应将--no-site添加到您的命令或{ {1}}到你的uwsgi.ini文件。

答案 2 :(得分:13)

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

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

所以我收到了名为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

答案 3 :(得分:8)

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

  

apt-get install python3-pip

     

pip3安装uWSGI

这就是全部。

答案 4 :(得分:4)

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

<ContentControl regions:RegionManager.RegionName="MyRegion"></ContentControl>

答案 5 :(得分: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

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

答案 6 :(得分:0)

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

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

答案 7 :(得分: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会显示安装日期。另外,您可以使用pip3 list检查是否为当前版本安装了uWSGI。

希望这会有所帮助!