繁体   English   中英

如何使用virtualenv运行uwsgi

[英]How do I run uwsgi with virtualenv

我目前正在开发我的第一个真正的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 site-packages? 我首选的位置是在startup脚本中,而不是在nginx配置中。

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

uwsgi -H /path/to/your/virtualenv 

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

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

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

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

我使用uWSGI 2.0。

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

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

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

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

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

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

在Beau的回答之前,我从来没有看到应该将virtualenv值explicitly设置为什么的答案 - 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文件夹,这就是为什么有这么多的导入错误的原因。

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

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM