部署Heroku时pycrypto编译失败问题求助
Heroku部署Python项目时pycrypto编译失败问题解决
问题描述
部署项目到Heroku时触发以下报错:
ERROR: Could not build wheels for pycrypto, which is required to install pyproject.toml-based projects
项目未直接依赖pycrypto,requirements.txt内容如下:
- python==3.10.9
- firebase_admin
- pyrebase
- pyrebase4
- dash
- dash_auth
- dash_bootstrap_components
- dash_daq
- pandas
- plotly
Heroku CLI关键报错片段:
src/_fastmath.c:33:10: fatal error: longintrepr.h: No such file or directory 33 | #include <longintrepr.h> /* for conversions */ | ^~~~~~~~~~~~~~~ compilation terminated. error: command '/usr/bin/gcc' failed with exit code 1
原因分析
- 间接依赖引入pycrypto:项目未直接声明,但
pyrebase或pyrebase4等依赖的子依赖链中包含了pycrypto。 - pycrypto废弃不兼容高版本Python:pycrypto是停止维护的老旧加密库,其代码依赖的
longintrepr.h头文件在Python 3.10+版本中已被移除,导致编译失败。 - Heroku环境Python版本不符:虽然
requirements.txt指定Python 3.10.9,但Heroku构建时实际使用了Python 3.11(从报错路径/app/.heroku/python/include/python3.11可验证),版本差异加剧了兼容性问题。
可行解决方案
方案1:替换pycrypto为维护中替代库
在requirements.txt中强制添加pycryptodome(pycrypto的官方兼容替代库),覆盖间接依赖的pycrypto:
python==3.10.9 firebase_admin pyrebase pyrebase4 dash dash_auth dash_bootstrap_components dash_daq pandas plotly pycryptodome>=3.18.0
pip会自动用pycryptodome替换pycrypto的依赖,二者API完全兼容。
方案2:锁定Python版本确保环境一致
在项目根目录创建runtime.txt文件,明确指定Python版本:
python-3.10.9
强制Heroku使用指定版本,避免自动升级导致的环境差异。
方案3:清理重复依赖
同时安装pyrebase和pyrebase4可能导致依赖冲突,尝试只保留其中一个,简化依赖链,可能避免引入pycrypto。
方案4:临时跳过编译(不推荐长期使用)
在项目根目录创建pip.conf文件,添加以下内容跳过pycrypto的二进制编译:
[global] no-binary = pycrypto
此方法仅作为临时 workaround,长期建议使用方案1替换依赖。
内容的提问来源于stack exchange,提问作者Homit Dalia
相关产品推荐
相关产品推荐

