为何Python Discord Bot部署到Heroku时编译失败?
问题核心原因
guesslang 2.0.1 内置强制绑定依赖 tensorflow==2.2.0,本地运行正常是因为本地操作系统、Python版本刚好匹配该版本tensorflow的安装包;但Heroku的构建环境默认不满足该依赖的匹配要求,因此检索不到对应安装包,最终导致部署失败。
常见的不匹配原因有两点:
- Heroku 默认拉取最新的稳定Python版本(当前为3.11/3.12),而 tensorflow==2.2.0 最高仅支持 Python 3.8,没有适配高版本Python的预编译安装包
- 该版本tensorflow未提供对应Heroku构建栈的可用wheel包
可行解决方法
方案一:指定适配的Python版本
- 在项目根目录新增
runtime.txt文件,写入内容:python-3.8.18,这是Heroku官方支持的、可兼容tensorflow 2.2.0的Python 3.8系列稳定版本 - 重新提交代码触发部署,构建过程会自动使用Python 3.8环境,可检索到对应tensorflow 2.2.0的安装包
- 注意:带tensorflow的依赖包整体体积较大,需要确认Heroku应用的slug大小、dyno内存配额足够支撑运行(普通Eco级dyno仅512M内存,大概率会出现运行时内存溢出)
方案二:跳过guesslang的强制版本绑定
如果不想降级Python版本,可以调整requirements.txt的依赖顺序,跳过guesslang的自动依赖安装,复用手动指定的高版本tensorflow:
git+https://github.com/Rapptz/discord.py PyNaCl==1.3.0 dnspython==1.16.0 pandas async-timeout==3.0.1 pip youtube_dl colorlog pyjokes howdoi # 先指定适配当前Python版本的tensorflow版本 tensorflow==2.13.0 # 跳过guesslang的自动依赖安装,复用上面指定的tensorflow guesslang --no-deps
只要指定的tensorflow版本API兼容guesslang的调用逻辑,即可正常运行,且不需要降级Python版本。
方案三:替换轻量语言检测库(最推荐)
guesslang是基于深度学习的语言检测工具,自带的tensorflow依赖体积超过500M,非常容易触发Heroku的slug大小限制、运行时内存溢出问题。对于Discord Bot这类轻量应用来说,该依赖的成本过高,可直接替换为同功能的轻量库:
- 移除
requirements.txt中的guesslang行 - 新增轻量语言检测库依赖:
langdetect==1.0.9
整体依赖体积会大幅缩减,几乎不会出现部署适配问题。
内容的提问来源于stack exchange,提问作者Aditya Tomar
相关产品推荐
相关产品推荐

