【问题标题】:How do I run uwsgi with virtualenv如何使用 virtualenv 运行 uwsgi
【发布时间】:2013-08-27 09:21:45
【问题描述】:

我目前正在开发我的第一个真正的 python 烧瓶项目,并且即将设置构建服务器以部署在每次签入时构建的“最新构建”。

我已经设置了一个启动脚本,我在其中使用 uwsgi 启动应用程序,这部分工作正常。我最近也开始使用virtualenv,这样安装的包就会添加到我的项目projectname\flask\Lib\site-packages下。

我使用nginx 作为网络服务器,配置如下:

location / { try_files $uri @graderbuild; }
location @graderbuild {
    include uwsgi_params;
    uwsgi_param UWSGI_CHDIR /usr/local/grader/build;
    uwsgi_param UWSGI_PYHOME /usr/local/grader/build;
    uwsgi_pass 127.0.0.1:3031;
}

我开始使用uwsgi

exec /usr/local/bin/uwsgi --master --socket 127.0.0.1:3031
    --wsgi-file restserver.py --callable app --processes 4 --die-on-term
    --threads 2 >> /var/log/grader-build.log 2>&1

现在我知道我是否做得对...目前我正在将整个文件夹部署到构建服务器。我不想安装全局 python 模块只是为了让我的构建工作。对还是错?

我目前得到的错误是:

ImportError: No module named flask_wtf

如果我是对的,如何配置设置以使用 virtualenv 站点包?我的首选位置是在startup 脚本中,而不是在nginx 配置中。

【问题讨论】:

    标签: python flask virtualenv uwsgi


    【解决方案1】:

    使用-H 将virtualenv 设置为python 路径。

    uwsgi -H /path/to/your/virtualenv 
    

    http://uwsgi-docs.readthedocs.org/en/latest/Options.html#virtualenv

    【讨论】:

    • 它改变了,但现在我得到了:ImportError: No module named site。你知道那可能是什么吗?
    • 尝试从 --no-site 开始,但我无法导入 os 模块
    • @Asken 尝试用--system-site-packages创建你的virtualenv?
    • 这会将system-site-packages 复制到我的virtualenv 中吗?
    • 有同样的导入错误:ImportError: No module named site。原来我只提供了 virtualenv 的名称,但您需要提供 完整路径
    【解决方案2】:

    要使用已激活的 virtualenv,您可以在 uwsgi.ini 中使用此配置 sn-p:

    ; If VIRTUAL_ENV is set then use its value to specify the virtualenv directory
    if-env = VIRTUAL_ENV
    virtualenv = %(_)
    endif =
    

    【讨论】:

    • 如果您使用 virtualenv,这是最好的解决方案,因为它还可以灵活地在具有不同 venv 名称的不同环境(生产/登台/开发)中工作!
    • pipenv 创建动态命名的 virtualenvs,所以我怀疑随着 pipenv 的继续采用这种方法将越来越普遍。
    • 命令行大小写转换为uwsgi --virtualenv $VIRTUAL_ENV etc
    【解决方案3】:

    作为user995394 pointed out,有一种方法可以告诉uWSGI使用现有的虚拟环境。 但是,当我以 virtualenv = /full/path/to/my/virtualenv 的形式传递 uWSGI 选项(它来自 INI 配置)时,它会抱怨 ImportError: No module named site。我发现的解决方法是你从你的 virtualenv 所在的文件夹启动 uWSGI 并只传递 virtualenv = my_virtualenv_name (即路径是相对的)。

    我使用 uWSGI 2.0。

    【讨论】:

    • 你能举一个 my_virtualenv-name 的具体例子吗?我用的是virtualenvwrapper,我试过路径~/.virtualenvs/a-virtualenv-created-by-virtualenvwrapper/和名字a-virtualenv-created-by-virtualenvwrapper,不行。
    • @attolee,尝试路径~/.virtualenvs/ 和选项virtualenv = a-virtualenv-created-by-virtualenvwrapper
    • 它不起作用。我得到了输出,Python version: 2.7.6 (default, Jun 22 2015, 18:01:27) [GCC 4.8.2] Set PythonHome to ~/.virtualenvs/ ImportError: No module named sitePython version: 2.7.6 (default, Jun 22 2015, 18:01:27) [GCC 4.8.2] Set PythonHome to python3.4.3-uwsgi-django1.8-nginx ImportError: No module named site ,顺便说一下,我也使用 pyenv 来管理 python 版本。
    • ~/.virtualenvs/a-virtualenv-created-by-virtualenvwrapper/ 工作。
    • @attolee 跟我一样,最好的办法是手动激活环境。
    【解决方案4】:

    其他人的回答没有帮助,我将 virtualenv 的路径添加到 uwsgi.ini 配置文件。错误消失了。

    pythonpath = /path-to-virtualenv/project/lib/python2.7/site-packages
    

    【讨论】:

    • 天啊,想投票,但被禁止了,因为那是过去的我......)
    【解决方案5】:

    几个月前我遇到了这个问题,这里有一个完整的演示配置示例,包括 nginx、uwsgi 和 linux 上的 upstart 自动启动。

    https://stackoverflow.com/a/27221427/567606

    【讨论】:

      【解决方案6】:

      Beau 的回答为我解决了这个问题。

      我从来没有为 uwsgi 的 ini 文件指令找到一个很好的解释。

      在 Beau 的回答之前,我从来没有看到应该将 virtualenv 值设置为 explicitly 的答案 - venv 中 python 树的根、站点包下的应用程序文件夹或 VENV 树的根。如果您不使用 venv 怎么办,您将 home 设置为什么、应用程序树的顶部、python bin 文件夹的顶部、python lib 文件夹或 dist-packages?

      我有这个应用程序在另一个系统上运行,所以在 docker 容器下运行它真的不应该那么困难。现在我已经让它工作了,我查看了那个工作安装,现在看到它指向 venv 树的顶部。我在那里使用 virtualenvwrapper,所以它与仅使用 virtualenv 时的路径不同。

      这让我想知道是否可以在没有 venv 的情况下运行这个应用程序。由于这将在 docker 容器中运行,因此没有充分的理由使用 venvs,但在查看 python 文件夹结构差异时,系统 python 和 venv python 之间存在很大差异。

      系统的 python3 被拆分为单独的文件夹,并且文件并不都在一个层次结构下,因为它们在一个 venv 下。如果你使用 pip 安装你的包,它们最终会在 /usr/local/lib/python3/dist-packages 中,并且该位置没有 site.py 或 encodings 文件夹,这就是为什么有这么多的导入错误。

      经过几次试验后,我发现要在没有 venv 的情况下运行我的应用程序,uwsgi ini 不应该定义 home 或 virtualenv 设置。如果您的系统路径同时包含 /usr/bin 和 /usr/local/bin 它应该可以工作并找到所有内容,即使 pip 安装的软件包也会转到具有不同文件夹层次结构的其他位置。

      【讨论】:

      • 这个消息在 SO 上的目的是什么?
      • 不确定我是否理解您的目的问题。这个答案与 OP 主题直接相关,但我还没有足够的代表来简单地发表评论,所以我不得不写一个答案来提供输入。以“It make me wonder”和“System's python3”开头的段落是我提供的新信息的要点,希望它可以节省其他人花费我弄清楚这一点的时间。我可以评论您的评论,但不能评论任何其他评论?嗯...
      • @user4830532 尽量不要用你的感受和意见,只用事实。 Here 你可以找到解释为什么你的答案会被否决并在之后被删除。
      • 好的,点了 Denys Kotsur。我编辑了我的帖子以消除情感包袱。
      猜你喜欢
      • 2014-04-07
      • 1970-01-01
      • 2023-03-26
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2013-02-24
      • 1970-01-01
      相关资源
      最近更新 更多