如何将Apache2上Flask应用的mod_wsgi从Python3.5切换到3.6?
解决Apache下mod_wsgi切换到Python3.6的问题
别担心,修改$PATH对Apache里的mod_wsgi完全没用——因为mod_wsgi是编译时就绑定了特定Python版本的,它不会读取系统环境变量来选择Python。你已经装了Python3.6对应的mod_wsgi,接下来要做的是让Apache加载这个新模块,而不是旧的Python3.5版本的mod_wsgi。
按以下步骤操作:
1. 确认Python3.6版mod_wsgi的模块路径
打开终端,用Python3.6的mod_wsgi-express工具生成正确的Apache模块配置命令。如果你的Python3.6安装在/usr/local/python3.6,就运行:
/usr/local/python3.6/bin/mod_wsgi-express module-config
这个命令会输出类似这样的内容:
LoadModule wsgi_module "/usr/local/python3.6/lib/python3.6/site-packages/mod_wsgi/server/mod_wsgi-py36.so" WSGIPythonHome "/usr/local/python3.6"
把这两行记下来,这就是让Apache用Python3.6的关键配置。
2. 修改Apache的主配置文件
找到Apache的主配置文件(通常是/etc/apache2/apache2.conf或者/etc/httpd/httpd.conf),或者专门的mod_wsgi配置文件(比如/etc/apache2/mods-available/wsgi.conf):
- 先找到原来加载mod_wsgi的行,比如
LoadModule wsgi_module modules/mod_wsgi.so,把它注释掉(加个#开头)。 - 把刚才
mod_wsgi-express输出的两行粘贴进去。
3. 检查你的Flask应用的.wsgi文件
打开你的应用对应的.wsgi文件,确保里面没有硬编码Python3.5的路径。比如,不要有类似这样的代码:
import sys sys.path.insert(0, '/usr/lib/python3.5/site-packages')
如果有,把路径改成Python3.6的对应目录(比如/usr/local/python3.6/lib/python3.6/site-packages)。
4. 重启Apache并验证
重启Apache服务:
# Debian/Ubuntu系统 sudo systemctl restart apache2 # CentOS/RHEL系统 sudo systemctl restart httpd
然后,你可以写一个简单的测试.wsgi文件来验证Python版本:
import sys def application(environ, start_response): status = '200 OK' output = sys.version.encode('utf-8') response_headers = [('Content-type', 'text/plain'), ('Content-Length', str(len(output)))] start_response(status, response_headers) return [output]
把这个文件配置到Apache里访问,就能看到当前使用的Python版本是不是3.6了。
常见坑点
- 如果之前用系统包管理器(比如
apt或yum)装过mod_wsgi,先禁用旧模块:sudo a2dismod wsgi(Debian/Ubuntu),避免和新模块冲突。 - 确保你安装mod_wsgi的时候是用Python3.6的pip安装的:
/usr/local/python3.6/bin/pip install mod_wsgi,这样才会绑定到3.6。
内容的提问来源于stack exchange,提问作者Nyta
相关产品推荐
相关产品推荐

