CentOS7下Flask2.2.2+Python3.10遇annotations未定义语法错误求助
问题排查与解决方案
核心原因
你的WSGI守护进程实际调用的不是虚拟环境里的Python3.10,而是系统默认的低版本Python(CentOS7默认Python3为3.6或更低,不支持from __future__ import annotations特性)。
解决步骤
1. 确认mod_wsgi绑定的Python版本
执行以下命令查看当前mod_wsgi关联的Python版本:
mod_wsgi -v
如果输出的版本不是3.10,说明mod_wsgi是基于系统旧版本Python编译的,需要重新编译适配Python3.10。
2. 重新编译mod_wsgi适配Python3.10
- 卸载旧版mod_wsgi:
yum remove mod_wsgi
- 安装编译依赖:
yum install python3.10-devel httpd-devel
- 用Python3.10的pip安装适配版本的mod_wsgi:
python3.10 -m pip install mod_wsgi
- 生成并配置mod_wsgi模块:
执行mod_wsgi-express install-module,复制输出中的LoadModule和WSGIPythonHome配置行,添加到httpd的配置文件(如/etc/httpd/conf.d/wsgi.conf)。
3. 修改VirtualHost配置指定Python环境
在VirtualHost的配置中,明确指定虚拟环境的Python路径,避免调用系统版本:
WSGIDaemonProcess appname python-home=/实际路径/venv2 python-path=/实际路径/site.com:/实际路径/venv2/lib/python3.10/site-packages WSGIScriptAlias / /实际路径/wsgi.py
替换上述代码中的/实际路径/为你的项目和虚拟环境真实路径。
4. 修正wsgi.py的shebang行
将wsgi.py的第一行改为虚拟环境内Python的绝对路径,避免依赖系统默认Python:
#!/实际路径/venv2/bin/python
5. 重启httpd服务生效
systemctl restart httpd
额外验证(可选)
在wsgi.py开头添加版本打印代码,验证实际运行的Python版本:
import sys print(f"Python version: {sys.version}", file=sys.stderr)
查看httpd错误日志(/var/log/httpd/error_log),确认输出的版本为3.10。
内容的提问来源于stack exchange,提问作者Joshua
相关产品推荐
相关产品推荐

