52

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

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

nginx用作 Web 服务器,配置如下所示:

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配置中。

4

6 回答 6

67

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

uwsgi -H /path/to/your/virtualenv 

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

于 2013-08-24T11:21:28.300 回答
20

要使用激活的 virtualenv,您可以在您的uwsgi.ini

; If VIRTUAL_ENV is set then use its value to specify the virtualenv directory
if-env = VIRTUAL_ENV
virtualenv = %(_)
endif =
于 2015-02-06T02:29:49.983 回答
12

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

我使用 uWSGI 2.0。

于 2014-01-17T10:05:02.840 回答
6

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

pythonpath = /path-to-virtualenv/project/lib/python2.7/site-packages
于 2019-01-02T17:00:57.270 回答
1

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

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

于 2015-02-06T05:46:29.063 回答
0

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

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

在 Beau 的回答之前,我从来没有看到explicitly关于 virtualenv 值应该设置为什么的答案 - 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 安装的软件包也会转到具有不同文件夹层次结构的其他地方。

于 2018-04-24T19:16:52.977 回答