部署Flask应用至Gcloud/Heroku时导入Keras与OpenCV报错求助
解决Flask部署到Google Cloud App Engine/Heroku时的OpenCV和TensorFlow/Keras依赖问题
我之前在部署Flask应用到这两个平台时也踩过一模一样的坑,这俩问题都是服务器运行环境缺少必要依赖导致的,咱们逐个拆解解决:
一、OpenCV报错:libSM.so.6: cannot open shared object file: No such file or directory
这个报错的核心原因是:GAE和Heroku的基础Python运行镜像都是轻量级的,没有预装OpenCV普通版本依赖的X11图形相关系统库(libSM就是其中之一)。有两种解决思路:
方案1:改用无图形依赖的OpenCV版本
直接把requirements.txt里的opencv-python替换成opencv-python-headless——这个是专门为服务器/无界面环境打造的版本,去掉了所有图形界面相关的依赖,完全满足后端图像处理需求。
修改后的requirements.txt片段:
opencv-python-headless==4.5.5.62 # 可根据需求指定合适版本
方案2:手动安装系统级依赖(适合必须用普通版OpenCV的场景)
- Google Cloud App Engine:如果使用自定义Docker镜像,在
Dockerfile里添加以下命令安装依赖:
RUN apt-get update && apt-get install -y --no-install-recommends \ libsm6 \ libxext6 \ libxrender-dev
- Heroku:在项目根目录创建
Aptfile文件,写入需要安装的系统包:
libsm6 libxext6 libxrender-dev
Heroku会自动读取这个文件并安装对应的依赖。
二、TensorFlow报错:ModuleNotFoundError: No module named 'tensorflow'
这个问题是因为旧版Keras需要依赖TensorFlow作为后端,但你的依赖清单里可能只声明了keras,没有明确添加tensorflow;另外版本不匹配也可能触发这个报错。
解决步骤:
- 明确添加TensorFlow依赖:在
requirements.txt里加入tensorflow(服务器环境推荐用CPU版tensorflow-cpu,更轻量),注意版本要和Keras兼容,比如Keras 2.8.x对应TensorFlow 2.8.x:
tensorflow-cpu==2.8.0
- 推荐升级写法(彻底避免版本兼容问题):如果你的Keras版本较新,建议直接使用TensorFlow整合的Keras模块,把代码里的:
from keras.models import load_model
改成:
from tensorflow.keras.models import load_model
这样只需要安装tensorflow即可,不需要单独安装keras,从根源上避免依赖冲突。
完整示例配置
requirements.txt
Flask==2.0.3 opencv-python-headless==4.5.5.62 tensorflow-cpu==2.8.0 # 其他你的项目依赖
GAE的app.yaml(示例)
runtime: python39 entrypoint: gunicorn -b :$PORT main:app
Heroku的Procfile(示例)
web: gunicorn main:app
内容的提问来源于stack exchange,提问作者vishvesh soni
相关产品推荐
相关产品推荐

