python venv 的激活(activate_this.py)无法工作或抛出错误

doo*_*oon 5 debian apache2 flask python-3.x debian-buster

Soo,我创建了一个小型 Flask 网站,我想将其部署在带有 Apache 2.4 的 Debian 10 服务器上

首先,我按照教程创建了 apache2 conf 文件和 .wsgi 文件。由于效果不佳,我收到错误“ModuleNotFoundError:没有名为“flask”的模块”,因此我设置了一个虚拟环境

python3 -m venv venv
Run Code Online (Sandbox Code Playgroud)

并将我的 .wsgi 更改为

#!/usr/bin/python3
import sys
import logging

activate_this = '/home/bot/Club-Manager/Webinterface/venv/bin/activate_this.py'

with open(activate_this) as file_:
        exec(file_.read(), dict(__file__=activate_this))

logging.basicConfig(stream=sys.stderr)
sys.path.insert(0,"/home/bot/Club-Manager/Webinterface/")

import app as application

Run Code Online (Sandbox Code Playgroud)

现在我明白了

Failed to exec Python script file '/var/www/html/Webinterface/Webinterface.wsgi'
Exception occurred processing WSGI script '/var/www/html/Webinterface/Webinterface.wsgi'., file "/var/www/html/Webinterface/Webinterface.wsgi", line 8, in <module>, 
exec(file_.read(), dict(__file__=activate_this))
File "<string>", line 28, in <module>
AttributeError: 'str' object has no attribute 'decode'
Run Code Online (Sandbox Code Playgroud)

起初,“activate_this.py”对我来说并不存在,一些研究告诉我只需从我尝试过的 lib/virtualenv 文件夹中复制它(venv 中的一个和 ~/.local/ 中的一个)。经过更多研究后,我发现您应该使用与运行它相同的 python 版本创建 venv (Duh),我检查并使用 python3 而不是仅仅使用 python 创建了 venv,因为安装了 python3 和 python2 (甚至如果“python”让我进入 python 3.7,但 /usr/bin/python 是 python 2)。我还尝试了 venv/lib/virtualenv 中的“activator.py”文件,但这也不起作用(它确实起作用,但还抛出了烧瓶未找到错误)

我检查并重新安装了 venv 中的依赖项,我检查了它们是否为 python3 安装,确实如此。

所以现在我很迷茫,我猜问题是“activate_this.py”文件,但我不知道如何获得一个功能性的文件,也不知道还有什么可能导致这个问题。将我的请求从域转发到 python 脚本的“Apache2 部分”似乎可以工作(我猜是因为为什么我还能看到错误),所以我没有附加 apache conf,但如果需要,我可以将其发布。我还检查了文件夹的权限, /var/www/html/Webinterface 是 /home/bot/Club-Manager/Webinterface 的符号链接,所有这些文件夹都有 bot:www-data ,这是 apache2 应该使用的用户和组

感谢您提前提供任何提示

jyt*_*tou 1

我知道这已经有一年了,但如果有人遇到同样的问题......

我发现的最简单/最快/最干净的方法是简单地从 wsgi 文件的 venv 中引用 python 解释器,如下所示:

#!/path/to/your/venv/bin/python
Run Code Online (Sandbox Code Playgroud)

从那里,您的 wsgi 应用程序将使用相应的 python,无需激活、搜索包等。