如何在virtualenv中运行uwsgi

55

我正在开发我的第一个真正的Python Flask项目,并准备设置构建服务器来部署“最新版本”,该版本是在每次检查时构建的。

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

71

4
它发生了变化,但现在我收到了这个错误:ImportError: No module named site。你知道可能是什么原因吗? - Asken
1
т░ЮУ»ЋСй┐уће--no-siteтљ»тіе№╝їСйєТў»ТЌаТ│Ћт»╝тЁЦosТеАтЮЌсђѓ - Asken
@Asken 试着用 --system-site-packages 参数创建你的 virtualenv? - iMom0
这会将 system-site-packages 复制到我的虚拟环境中吗? - Asken
7
遇到了相同的导入错误:ImportError: No module named site。结果发现我只提供了虚拟环境的名称,但是你需要提供完整路径 - RickyA
我使用以下命令解决了这个问题: uwsgi -H /path/to/your/virtualenv --ini file.ini 它需要传递--ini标志。 - Rajesh Veeranki

21

要使用已激活的虚拟环境,您可以在uwsgi.ini中使用此配置片段:

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

3
如果您使用virtualenv,这是最佳解决方案,因为它还具有在不同环境(生产/暂存/开发)中使用不同venv名称的灵活性! - Alain1405
1
pipenv 创建动态命名的虚拟环境,因此我认为随着 pipenv 的普及,这种方法将越来越普遍。 - paperreduction
1
命令行中的案例翻译为 uwsgi --virtualenv $VIRTUAL_ENV etc - m3nda

12

正如用户995394所指出的,有一种方法可以告诉uWSGI使用现有的虚拟环境。

但是,当我以virtualenv = /full/path/to/my/virtualenv的形式传递uWSGI选项(来自INI配置文件)时,它会抱怨ImportError: No module named site。我发现的解决方法是在您的虚拟环境所在的文件夹中启动uWSGI,并仅传递virtualenv = my_virtualenv_name(即路径是相对的)。

我使用的是uWSGI 2.0版本。


你能给一个关于my_virtualenv-name的具体例子吗?我使用virtualenvwrapper,已经尝试了路径~/.virtualenvs/a-virtualenv-created-by-virtualenvwrapper/和名称a-virtualenv-created-by-virtualenvwrapper,但都不起作用。 - attolee
@attoleeпјЊиЇ·е°ќиЇ•дЅїз”Ёи·Їеѕ„~/.virtualenvs/е’ЊйЂ‰йЎ№virtualenv = a-virtualenv-created-by-virtualenvwrapperгЂ‚ - Palasaty
1
它不起作用。我得到了输出,Python版本:2.7.6(默认,Jun 22 2015,18:01:27)[GCC 4.8.2]将PythonHome设置为~/.virtualenvs/ ImportError:没有名为site的模块,以及Python版本:2.7.6(默认,Jun 22 2015,18:01:27)[GCC 4.8.2]将PythonHome设置为python3.4.3-uwsgi-django1.8-nginx ImportError:没有名为site的模块,顺便说一下,我还使用pyenv来管理Python版本。 - attolee
~/.virtualenvs/a-virtualenv-created-by-virtualenvwrapper/ 可以工作。 - attolee
@attolee 我也遇到了同样的问题,最好的解决方案是手动激活环境。 - TheExorcist
我遇到了同样的问题。在我的情况下,我正在使用Python3。因此,使用pip3而不是pip安装uwsgi解决了该问题。 - viswanath

7

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

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

这有点帮助。我的特定设置抱怨无法从celery导入。通过这个补充,我无法从二进制包(具体来说是psycopg2-binary)中导入。至少我有更多的信息。 - Árni St. Steinunnarson
这有点帮助。我的特定设置抱怨无法从celery导入。通过这个补充,我无法从二进制包(特别是psycopg2-binary)导入。至少我有更多的信息。 - undefined

1

0

Beau的回答解决了我的问题。

我从未找到uwsgi ini文件指令的好解释。

在Beau的回答之前,我从未看到过对virtualenv值应该明确设置为什么的答案 - 在venv中python树的根目录、site-packages下的应用程序文件夹或VENV TREE的根目录。如果您没有使用venv,home应该设置为什么?是应用程序树的顶部、python bin文件夹的顶部、python lib文件夹还是dist-packages?

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

这让我想知道是否有可能在没有venv的情况下运行此应用程序。由于这将在docker容器中运行,因此没有真正使用venv的好理由,但是在查看python文件夹结构差异时,系统python和venv python之间的差异非常大。

系统的python3被分成了不同的文件夹,而且这些文件并不像在虚拟环境下那样都在一个单一的层次结构下。如果你使用pip安装软件包,它们将会被安装到/usr/local/lib/python3/dist-packages目录下,但是该位置没有site.py或encodings文件夹,这就是为什么很多人会出现导入错误的原因。

经过几次尝试后,我发现如果要在没有虚拟环境的情况下运行我的应用程序,则uwsgi ini文件不应定义home或virtualenv设置。如果您的系统路径包括/usr/bin和/usr/local/bin两个路径,则应该可以正常工作并找到所有内容,即使pip安装的软件包位于具有不同文件夹层次结构的其他位置。


这条信息在SO上的目的是什么? - Denys Kotsur
我不确定我理解你的问题或目的。这个答案直接与OP主题相关,但我还没有足够的声望来简单地评论,所以我不得不写一个答案来提供输入。以“它让我想起”和“系统的python3”开头的段落是我提供的新信息的主要要点,希望它能节省其他人找出这个问题所花费的时间。我可以回复你的评论,但不能回复其他任何评论?嗯... - user4830534
@user4830532 请尽量不要使用您的感受和观点,只使用事实。在这里,您可以找到有关为什么您的答案可能会被投票降低和删除的解释。 - Denys Kotsur
好的,Denys Kotsur 的意见我已经听取了。我编辑了我的帖子,去掉了情感包袱。 - user4830534

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接