Linux(AWS Elastic Beanstalk)环境下PyQt5报ImportError: libGL.so.1错误
解决AWS Elastic Beanstalk部署PyQt5/QWebEnginePage时的libGL.so.1缺失问题
嘿,我之前部署依赖PyQt5的项目到EB时也踩过这个坑,给你拆解下问题和解决办法:
为啥会出这问题?
你本地Windows跑没问题,是因为Windows版的PyQt5已经把OpenGL这类底层依赖打包进去了,但AWS Elastic Beanstalk用的Linux环境(不管是Amazon Linux还是AL2)默认没装libGL.so.1这个OpenGL系统库,而QWebEnginePage刚好要靠它才能运行,所以部署后就报找不到文件的错了。
几个可行的解决办法
办法1:用.ebextensions自动装系统依赖
这是最直接的方案,让EB在部署的时候帮你把缺失的库装上:
- 在项目根目录新建一个
.ebextensions文件夹(没有的话就建) - 里面新建个
packages.config文件,内容写:
packages: yum: mesa-libGL: [] mesa-libGL-devel: []
- 把这个文件夹和代码一起打包,重新跑
eb deploy就行
办法2:换个不需要PyQt5的无头渲染方案
如果你的爬虫只是需要渲染JS页面,没必要死磕PyQt5的话,可以换纯Python的无头工具,比如:
- requests-html:基于requests和pyppeteer,不用额外装系统库,一行
r.html.render()就能渲染JS - playwright:虽然要装驱动,但部署时用
playwright install就能搞定,也不会碰libGL的问题
举个requests-html的简单例子:
from requests_html import HTMLSession session = HTMLSession() page = session.get("你的目标网址") page.html.render() # 渲染动态内容 # 接下来就可以提取页面元素了
办法3:针对Amazon Linux 2的钩子脚本(如果用的是AL2环境)
要是你的EB环境是Amazon Linux 2,也可以用平台钩子来装依赖:
- 新建
.platform/hooks/predeploy文件夹 - 里面放个叫
install_deps.sh的脚本,内容:
#!/bin/bash sudo yum install -y mesa-libGL mesa-libGL-devel
- 别忘了给脚本加执行权限:
chmod +x .platform/hooks/predeploy/install_deps.sh - 打包部署就ok了
验证下是否搞定
部署完可以用eb ssh登到EC2实例里,跑ldconfig -p | grep libGL看看有没有输出,要是能查到libGL的路径,就说明库装好了,再启动应用应该就没问题了。
内容的提问来源于stack exchange,提问作者Joker
相关产品推荐
相关产品推荐

