Flask 应用程序使用了错误的 Python 解释器 - 需要知道如何 "compile" mod_wsgi 与特定的 Python 版本一起工作

Flask App using wrong Python interpreter - need to know how to "compile" mod_wsgi to work with specific Python version

TL;DR,我需要知道如何 "compile" WSGI 文件使用不同的 Python 解释器我最初安装了 mod_wsgi。

这是我的第一个 Flask app/website,希望您能原谅我的一些无知。我会尽量给你相关的细节。

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

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

我的应用程序抛出奇怪的异常,并发现我的 Flask 应用程序运行使用了错误版本的 Python 解释器,因此一些代码没有按预期工作.我安装了 pyenv,并将 Python 3.8.1 设置为全局,但是当应用程序 运行s 通过 Apache 时,它​​使用的是 Python 2.7.17([=86 附带的版本=] 18.04)。我至少解决了部分问题。我正在关注本教程:https://www.digitalocean.com/community/tutorials/how-to-deploy-a-flask-application-on-an-ubuntu-vps

在某一时刻,教程让您执行 sudo pip install Flask,这似乎安装了 Flask "globally"(即,在 venv 之外,这似乎违背了目的)。不确定我是否使用了正确的术语。所以我一直在做:

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

然后,当我 运行 我的应用程序时,无论是通过 Apache,还是仅从终端 window,我都会将 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 中。我发现这个 post:

并尝试了建议的解决方案,在我的 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?我遵循了其中一位评论者 post 编辑的 link,关于使用 WSGI 的虚拟环境:https://modwsgi.readthedocs.io/en/develop/user-guides/virtual-environments.html

据我所知,我必须在安装 pyenv 和 Python 3.8.1 之前安装 mod_wsgi。所以 mod_wsgi 是 "compiled" 与旧版本的 Python,你不能使用虚拟环境来强制 mod_wsgi 使用不同的 python 版本installed/compiled 的那个。我如何重新安装和编译 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 版本吗?

经过多次谷歌搜索、反复试验和自我厌恶后,我明白了。我尝试了很多不同的方法来安装 mod_wsgi,但都没有用。我发现了一个 Whosebug post,它向我展示了一个阻碍我前进的陷阱,那就是我没有安装 python 3.8.1 使用 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!我的 app/website 是 运行 Python 3.8.1!