首页 > 解决方案 > python venv的激活(activate_this.py)不会工作或抛出错误

问题描述

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

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

python3 -m venv venv

并将我的 .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

现在我明白了

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'

起初“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 应该使用的用户和组

感谢您提前提供任何提示

标签: python-3.xflaskdebianapache2debian-buster

解决方案


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

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

#!/path/to/your/venv/bin/python

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


推荐阅读