Flask App使用错误的Python解释器-需要知道如何“编译” mod_wsgi以使用特定的Python版本

问题描述 投票:0回答:1

TL; DR,我需要知道如何以一种与我最初安装mod_wsgi时不同的Python解释器的方式“编译” WSGI文件。

这是我第一个Flask应用程序/网站,因此希望您可以原谅一些无知。我会尽力为您提供相关详细信息。

我有一个通过Nginx / Apache(反向代理设置)在Ubuntu服务器上运行的Flask应用。我的文件夹结构是这样的:

|----MyApp
|------MyApp.wsgi
|------MyApp
|--------__init__.py
|--------templates
|--------static
|--------requirements.txt
|--------venv

我从我的应用程序中抛出了奇怪的异常,发现我的Flask应用程序运行了错误版本的Python解释器,因此某些代码无法正常工作。我已经安装了pyenv,并将Python 3.8.1设置为全局,但是当应用程序通过Apache运行时,它使用的是Python 2.7.17(Ubuntu 18.04附带的版本)。我至少发现了部分问题。我跟随本教程一起学习:https://www.digitalocean.com/community/tutorials/how-to-deploy-a-flask-application-on-an-ubuntu-vps

[在某一时刻,本教程让您执行sudo pip install Flask,这似乎是“全局”安装Flask的(即,在venv外部,这似乎无法达到目的)。不知道我是否使用正确的术语。所以我一直在做:

python3 -m venv venv
source venv/bin/activate
sudo pip install Flask

[然后,当我通过Apache甚至只是从终端窗口运行我的应用程序时,我将sys.version打印到.txt文件,因此我可以看到它正在使用的Python解释器,瞧,使用的是2.7.17,而不是3.8.1。因此,通过反复试验,我了解到sudo pip install Flask不是我想要的。 pip install Flask(在激活venv的情况下运行时)会在我从终端运行Flask应用程序时产生所需的结果:

source venv/bin/activate
export FLASK_APP=__init__.py
flask run

BAM,我得到了正确版本的Python,即3.8.1。但是,现在我有一个新问题。当我重新启动Apache并尝试访问我的网站时,Apache出现以下错误:Exception occurred processing WSGI script '/var/www/MyApp/MyApp.wsgi'ImportError: No module named flask

我想我要告诉Apache或WSGI(或任何人)我的Flask安装在哪里,因为它仅安装在venv中。我发现了这样的帖子:Flask - WSGI - No module named 'flask'

并在我的Apache配置中使用python-path指令尝试了建议的解决方案,如下所示:

  WSGIScriptAlias / /var/www/MyApp/MyApp.wsgi
  # WSGIDaemonProcess MyApp python-home=/var/www/MyApp/MyApp/venv
  WSGIDaemonProcess MyApp python-path=/var/www/MyApp:/var/www/MyApp/MyApp/venv/lib/python3.8/site-packages
  WSGIProcessGroup MyApp

[BAM,我的应用程序可以再次使用,但是为什么仍然使用Python 2.7.17?我遵循了其中一位评论者发布的有关WSGI中使用虚拟环境的链接:https://modwsgi.readthedocs.io/en/develop/user-guides/virtual-environments.html

根据我的收集,在安装pyenv和Python 3.8.1之前,我必须先安装mod_wsgi。因此,mod_wsgi是使用旧版本的Python“编译”的,并且您不能使用虚拟环境来强制mod_wsgi使用与其安装/编译的Python版本不同的python版本。如何重新安装和编译mod_wsgi,使其在我的首选Python版本上有效?

编辑:我尝试做

sudo apt-get --purge remove libapache2-mod-wsgi
sudo apt-get install libapache2-mod-wsgi-py3

但是,现在我的应用程序使用Python 3.6.9(Ubuntu 18.04随附的系统版本)。因此,看来这种安装方法忽略了我的pyenv设置(Python 3.8.1)。我可以覆盖它并以某种方式指定python版本吗?

python mod-wsgi
1个回答
0
投票

经过大量的搜寻,反复试验和自我厌恶之后,我才知道了。我尝试了许多不可行的安装mod_wsgi的方法。我发现了一个StackOverflow帖子,向我显示了一个阻碍我前进的陷阱,那就是我没有使用pyenv并设置了共享库选项来安装python 3.8.1:Run mod_wsgi with pyenv

所以我做到了:

pyenv uninstall 3.8.1
CONFIGURE_OPTS=--enable-shared pyenv install 3.8.1

然后,我能够激活我的虚拟环境,并在本地将mod_wsgi安装到我的应用程序。

rm -rf venv
python3 -m venv venv
source venv/bin/activate
pip install Flask
pip install mod_wsgi

然后,我不得不告诉apache使用哪个wsgi文件。幸运的是,您可以运行一个命令来告诉Apache:

mod_wsgi-express module-config

哪个输出是这样的:

LoadModule wsgi_module "/var/www/MyApp/MyApp/venv/lib/python3.8/site-packages/mod_wsgi/server/mod_wsgi-py38.cpython-38-x86_64-linux-gnu.so"
WSGIPythonHome "/var/www/MyApp/MyApp/venv"

我把它拍进了文件:/etc/apache2/mods-available/wsgi.load

重新启动apache,和SHAZAM!我的应用程序/网站在Python 3.8.1上运行!

© www.soinside.com 2019 - 2024. All rights reserved.