如何使用virtualenv运行uwsgi

时间:2013-08-24 10:59:36

标签: python flask virtualenv uwsgi

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

我已经设置了一个启动脚本,我使用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配置。

6 个答案:

答案 0 :(得分:50)

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

uwsgi -H /path/to/your/virtualenv 

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

答案 1 :(得分:14)

要使用已激活的virtualenv,您可以在uwsgi.ini中使用此配置代码段:

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

答案 2 :(得分:10)

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

我使用的是uWSGI 2.0。

答案 3 :(得分:1)

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

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

答案 4 :(得分:0)

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

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

答案 5 :(得分:-2)

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

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

直到Beau的回答我从未看到应该设置为explicitly virtualenv值的答案 - venv中python树的根,site-packages下的app文件夹或VENV TREE的根。如果你没有使用venv,你设置什么,应用程序树顶部,python bin文件夹顶部,python lib文件夹或dist-packages怎么办?

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

这让我想知道是否可以在没有venv的情况下运行这个应用程序。因为这将在docker容器中运行,所以没有充分的理由使用venvs,但是在查看python文件夹结构差异时,它们在system python和venv python之间是完全不同的。

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

经过几次试验后,我发现要在没有静脉注射的情况下运行我的应用程序,uwsgi ini不应该定义主页或virtualenv设置。如果你的系统路径同时包含/ usr / bin和/ usr / local / bin,那么它应该可以工作并查找所有内容,即使是已安装的软件包也可以使用不同的文件夹层次结构。