[英]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。
其他人的回答没有帮助,我添加了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.