繁体   English   中英

Flask 应用程序使用错误的 Python 解释器——需要知道如何“编译”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 ,我需要知道如何以使用与我最初安装 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打印到 a.txt 文件,这样我就可以看到它正在使用的 Python 解释器,瞧,它正在使用2.7.17,不是 3.8.1。 因此,通过反复试验,我了解到sudo pip install Flask不是我想要的。 当我从终端运行 Flask 应用程序时, pip install Flask (在激活我的 venv 的情况下运行)会产生我想要的结果:

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' and ImportError: No module named flask

我想我需要告诉 Apache 或 WSGI(或任何人)我的 Flask 安装在哪里,因为它只安装在 venv 中。 我找到了这篇 SO 帖子: 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 版本。 如何重新安装和编译 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,但都没有用。 我发现了一个 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 上运行!

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM