【问题标题】:uwsgi + Flask + virtualenv ImportError: no module named siteuwsgi + Flask + virtualenv ImportError: no module named site
【发布时间】:2013-06-27 19:33:13
【问题描述】:

(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


    【解决方案1】:

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

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

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

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

    感谢 Cody 在 cmets 中指出这一点。

    【讨论】:

    • 谢谢..这对我今天有帮助:)
    • 你是救生员。谢谢朋友
    • 谢谢,home 配置应该是 virtualenv 路径,但我写了 virtualenv python 位置。
    【解决方案2】:

    先看看@JRajan 的回答。

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

    【讨论】:

    • @hughes 顺便问一下“--no-site”是什么意思?
    • uwsgi -帮助 | grep "no\-site" 产生“--no-site 不导入站点模块”。 uWsgi 文档也没有多大帮助:uwsgi-docs.readthedocs.org/en/latest/…
    • 我怀疑这是否真的解决了您的问题。 “no module named ...”导入错误通常意味着 uwsgi 没有指向 virtualenv 的正确路径。 no-site 标志将阻止 virtualenv 加载站点包。因此,您不会再收到错误消息,但 uwsgi 也无法访问您的 python virtualenv 或任何站点包。检查你的路径!编辑:为后代张贴。我昨天花了 8 个小时在这上面...
    • @mapcuk @wes 我很确定--no-site 指的是内部python site.py 模块,您可以通过运行:python -c "import site; print site.__file__" 查看该模块的位置。它包含有关全局 python 安装的信息。不包括它意味着你完全依赖于 virtualenv。
    • 他说压制而不解决问题!
    【解决方案3】:

    在我的情况下,问题是 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
    

    【讨论】:

    • 这个 .ini 配置文件在哪里?
    • @luislhl 我已经添加了plugin = python34uwsgi.log 仍然返回Python version: 2.7.6 (default, Oct 26 2016, 20:33:43) [GCC 4.8.4] Set PythonHome to /home/rootadmin/.virtualenvs/data_collection ImportError: No module named site
    • @MitchellvanZuylen,也许它是在 Linux 发行版中使用不同的名称构建的。改用python3。如果它仍然不起作用,请尝试在 /usr/lib/uwsgi 或 /usr/lib64/uwsgi 中搜索名为“python34_plugin.so”的文件,以找出名称。你也可以尝试自己构建它:uwsgi-docs.readthedocs.io/en/latest/…
    【解决方案4】:

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

    apt-get install python3-pip

    pip3 安装 uWSGI

    就是这样。

    【讨论】:

    • +1 我在 Centos7 上遇到了同样的问题。我从 pip 安装了 uwsgi,从 yum (duh) 安装了插件。所以我不得不把所有东西都去掉(清理)。从 pip3 安装 python3.4、pip3 和 uwsgi。
    • 这是唯一最正确的答案!我只需运行 sudo -H pip uninstall uwsgi、apt-get install python3-pip & sudo -H pip3 install uwsgi。这解决了这个问题!!!!!!! Ubuntu 16.04 / 64bit / python2.x 系统范围 / python3.x 项目虚拟环境
    【解决方案5】:

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

    pip uninstall uwsgi    
    pip3 install uwsgi
    

    【讨论】:

      【解决方案6】:

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

      可能发生此错误的另一个原因是权限相关。如果是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 box 进行测试,默认用户是“vagrant”,而 nginx 使用 www-data 作为用户和组。我已将项目中所有文件的所有者设置为 www-data 用户和组,并将 vagrant 用户添加到 www-data 组。

      sudo gpasswd -a vagrant www-data

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

      【讨论】:

        【解决方案7】:

        当我的自制程序将我的 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 是否安装在当前版本上。

        希望这会有所帮助!

        【讨论】:

          【解决方案8】:

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

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

          【讨论】:

            猜你喜欢
            • 2015-05-08
            • 2019-04-03
            • 1970-01-01
            • 2012-12-21
            • 2013-05-12
            • 1970-01-01
            • 2017-02-20
            • 2021-07-20
            • 2017-01-24
            相关资源
            最近更新 更多