如何修复Heroku部署Dash应用时的psycopg2 ImportError问题
问题根因
- 2.8.6版本本地运行报错:该版本
psycopg2编译时绑定OpenSSL 1.1动态库路径,本地macOS环境的OpenSSL版本已升级,导致动态库匹配失败。之前打包上传到Heroku的对应wheel和Heroku Linux运行环境架构不兼容,所以部署后应用无法正常运行。 - 2.7.5版本Heroku部署失败:原生
psycopg2包需要在构建环境本地编译,Heroku默认Python镜像未预装PostgreSQL客户端开发依赖,gcc编译时找不到对应头文件,导致构建流程中断,代码被拒绝推送。
解决步骤
- 替换依赖选型:之前尝试安装psycopg2-binary未生效,通常是因为未卸载原有残留的psycopg2包导致文件被覆盖,或是requirements.txt仍保留旧版psycopg2声明被pip重新替换。需移除requirements.txt中所有原生
psycopg2版本条目,统一替换为psycopg2-binary==2.9.5。该版本是跨平台预编译二进制包,本地macOS、Heroku Linux环境均无需额外编译依赖,从根源规避两类报错。 - 本地环境清理与验证:
- 激活当前Python3.7.3对应的virtualenv虚拟环境
- 执行
pip uninstall -y psycopg2 psycopg2-binary,清理所有历史安装残留 - 执行
pip install psycopg2-binary==2.9.5安装兼容版本 - 执行
python -c "import psycopg2; print(psycopg2.__version__)"验证导入无报错
- Heroku端适配调整:
- 编辑项目根目录
requirements.txt,仅保留上述指定版本的psycopg2-binary条目,删除历史版本的psycopg2依赖声明 - 在项目根目录新增
runtime.txt文件,写入python-3.7.13,强制Heroku使用和本地一致的Python小版本,避免Heroku自动选用高版本Python带来的依赖不兼容问题 - 重新执行
git push heroku master即可完成部署
- 编辑项目根目录
避坑提示
- 不要同时在requirements中声明
psycopg2和psycopg2-binary,两个包会互相覆盖安装文件,触发导入异常 - 本地的libssl加载报错无需通过修改系统软链、调整OpenSSL路径解决,更换兼容的预编译包即可直接修复,避免破坏本地系统依赖环境
- 无需额外为Heroku安装PostgreSQL相关buildpack,
psycopg2-binary已将所需的客户端动态库打包,可直接对接Heroku提供的Postgres插件实例
内容的提问来源于stack exchange,提问作者Nikhil Sawal
相关产品推荐
相关产品推荐

