我正在开发我的第一个真正的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
配置。
答案 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。
答案 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,那么它应该可以工作并查找所有内容,即使是已安装的软件包也可以使用不同的文件夹层次结构。