【问题标题】:uWSGI + virtualenv 'No module named site'uWSGI + virtualenv '没有名为站点的模块'
【发布时间】:2017-08-31 00:58:01
【问题描述】:

所以这似乎是这个设置的一个非常常见的问题,但我找不到任何适用于 SO 的解决方案。我已经设置了一个非常新的 Ubuntu 15.04 服务器,然后安装了 nginx、virtualenv(和 -wrapper)和 uWSGI(通过 apt-get,所以是全局的,而不是在 virtualenv 中)。

我的 virtualenv 位于/root/Env/example。在 virtualenv 内部,我安装了 Django,然后在 /srv/www/example/app 运行 Django 的 startproject 命令,项目名称为 example,所以我隐约有这个结构:

-root
  -Env
    -example
      -bin
      -lib
-srv 
  -www
    -example
      -app
        -example
          manage.py
          -example
            wsgi.py
            ...

我的 uWSGI 的 example.ini 文件如下所示:

[uwsgi]
project = example

plugin = python

chdir = /srv/www/example/app/example
home = /root/Env/example
module = example.wsgi:application

master = true
processes = 5

socket = /run/uwsgi/app/example/example.socket
chmod-socket = 664
uid = www-data
gid = www-data
vacuum = true

但是无论我是通过uwsgi --ini /etc/uwsgi/apps-enabled/example.ini 还是通过守护进程运行它,我都会得到完全相同的错误:

Python version: 2.7.9 (default, Apr  2 2015, 15:37:21)  [GCC 4.9.2]
Set PythonHome to /root/Env/example
ImportError: No module named site

我应该注意到 Django 项目是通过内置的开发服务器 ./manage.py runserver 工作的,当我删除 home = /root/Env/example 时,事情就可以工作了(但显然是使用全局 Python 和 Django 而不是 virtualenv 版本,这意味着它对于正确的 virtualenv 设置是无用的)。

谁能看到一些我没有看到的明显路径错误?据我所知,home 基于我的目录结构以及 ini 中的所有其他内容都是完全正确的,那么为什么它不适用于此 ImportError?

【问题讨论】:

  • 解决了吗?

标签: virtualenv uwsgi


【解决方案1】:

在我的例子中,我看到了这个问题,因为我试图运行的 django 应用程序是用 python 3 编写的,而 uwsgi 是为 python 2 配置的。我通过以下方式解决了这个问题:

  1. 重新编译 uwsgi 以支持 python 2 和 python 3 应用程序 (我跟着this指南)
  2. 将此添加到我的 mydjangoproject_uwsgi.ini:
plugins         = python35 # or whatever you specified while compiling uwsgi 

对于使用 Django 的其他人,您还应该确保正确指定以下内容:

# Django dir that contains manage.py
chdir           = /var/www/project/myprojectname
# Django wsgi (myprojectname is the name of your top-level project)
module          = myprojectname.wsgi:application
# the virtualenv you are using (full path)
home            = /home/ubuntu/Env/mydjangovenv
plugins         = python35

【讨论】:

    【解决方案2】:

    正如@Freek 所说,站点指的是一个python 模块。

    该错误声称python找不到该包,这是因为您将python_home指定到了错误的位置。

    我也遇到过同样的问题,我的 uwsgi.ini 如下:

    [uwsgi]
    # variable
    base = /home/xx/
    # project settings
    chdir = %(base)/
    module = botservice.uwsgi:application
    home = %(base)/env/bin
    

    对于此配置,uwsgi 可以在 /env/bin 中找到 python 可执行文件,但在此文件夹下找不到包。所以我换了家

    home = %(base)/env/
    

    它对我有用。

    在您的情况下,我建议深入研究 home 指令并将其指向一个包含 python 可执行文件和包的位置。

    【讨论】:

      【解决方案3】:

      site 模块位于 django 的根目录中。

      首先检查是手动激活virtualenv(source /root/Env/example/bin/activate,启动python和import site)。如果失败,pip install django。

      假设 django 已正确安装在 virtualenv 中,请确保 uWSGI 激活了 virtualenv。相关uWSGI配置指令:

      plugins = python
      virtualenv = /root/Env/example
      

      如果您在导入 example.wsgi 时出错:

      pythonpath = /srv/www/example/app/example
      

      【讨论】:

        猜你喜欢
        • 2015-01-15
        • 1970-01-01
        • 2023-03-28
        • 1970-01-01
        • 2017-04-21
        • 2018-11-24
        • 2017-11-28
        • 2014-01-30
        • 2014-01-16
        相关资源
        最近更新 更多