Python3虚拟环境误用Python2.6的socket致PyMySQL报错,如何强制用虚拟环境版本?
问题根源分析
从你的错误日志里能明显看到/usr/lib64/python2.6/io.py的调用痕迹——这说明Apache的WSGI模块仍然在使用系统默认的Python2.6,根本没用到你创建的Python3虚拟环境,和你安装的python-socketio完全无关。
解决方案步骤
1. 确保Apache使用Python3版本的mod_wsgi
系统默认的mod_wsgi大概率是绑定Python2的,你需要安装对应Python3版本的模块:
- 如果你用的是CentOS/RHEL系列,直接安装适配包:
yum install python36-mod_wsgi # 这里的版本号对应你安装的Python3.6,按需调整 - 验证安装结果:运行
httpd -M | grep wsgi,输出里应该能看到Python3相关的标识;或者用mod_wsgi-express module-config查看模块路径,确认指向Python3目录。
2. 修改Apache配置,强制绑定虚拟环境
找到你的Web应用对应的Apache配置文件(比如/etc/httpd/conf.d/webapp.conf或者VirtualHost块),添加以下配置:
# 指定虚拟环境的Python根目录 WSGIPythonHome /var/www/webapp/py3env # 指定虚拟环境的site-packages路径,确保依赖能被找到 WSGIPythonPath /var/www/webapp/py3env/lib/python3.6/site-packages
同时,确保你的WSGI入口脚本(比如wsgi.py)里的依赖导入是基于虚拟环境的,不需要额外修改shebang(Apache的WSGI模块会忽略这个,主要靠上面的配置指定解释器)。
3. 确认虚拟环境的依赖安装正确
进入虚拟环境再检查一遍:
source /var/www/webapp/py3env/bin/activate pip list
确认Flask和PyMySQL都出现在列表里,避免之前误把依赖装到了系统Python2里。
4. 重启Apache生效
最后重启服务让配置生效:
systemctl restart httpd # 或者老版本用 service httpd restart
另外你提到的MySQL-python是Python2版本的MySQL驱动,和你虚拟环境里的PyMySQL不冲突,不用管它,确保应用代码里导入的是pymysql而非MySQLdb就行。
内容的提问来源于stack exchange,提问作者rahuL
相关产品推荐
相关产品推荐

