Heroku部署时无法安装R及rpy2问题求助
问题:Heroku部署Django+React项目时rpy2安装失败
问题详情
我在搭建基于Django和React的网站时,尝试安装适配rpy2的R buildpack,但部署到Heroku时持续报错。已确认以下配置:
- Buildpack顺序为Apt、Python、R
- 根目录存在
Aptfile、init.R和runtime.txt文件 Aptfile中包含r-baseruntime.txt指定了Python版本
试过清除缓存、重新安装buildpack,但仍无法成功安装rpy2,报错信息如下:
报错信息
正在收集 rpy2~=3.5.16 (来自 requirements.txt 第15行) remote: 正在下载 rpy2-3.5.17.tar.gz (220 kB) remote: 正在安装构建依赖项:已启动 remote: 正在安装构建依赖项:完成,状态为'done' remote: 获取构建wheel所需的依赖:已启动 remote: 获取构建wheel所需的依赖:完成,状态为'error' remote: error: subprocess-exited-with-error remote: remote: × 获取构建wheel所需的依赖执行失败 remote: │ 退出码:1 remote: ╰─> [34行输出] remote: 回溯(最近的调用最后): remote: 文件 "/app/.heroku/python/lib/python3.12/site-packages/pip/_vendor/pyproject_hooks/_in_process/_in_process.py", 第353行, in <module> remote: main() remote: 文件 "/app/.heroku/python/lib/python3.12/site-packages/pip/_vendor/pyproject_hooks/_in_process/_in_process.py", 第335行, in main remote: json_out['return_val'] = hook(**hook_input['kwargs']) remote: ^^^^^^^^^^^^^^^^^^^^^^^^^^^^ remote: 文件 "/app/.heroku/python/lib/python3.12/site-packages/pip/_vendor/pyproject_hooks/_in_process/_in_process.py", 第118行, in get_requires_for_build_wheel remote: return hook(config_settings) remote: ^^^^^^^^^^^^^^^^^^^^^ remote: 文件 "/tmp/pip-build-env-jhoy88xq/overlay/lib/python3.12/site-packages/setuptools/build_meta.py", 第334行, in get_requires_for_build_wheel remote: return self._get_build_requires(config_settings, requirements=[]) remote: ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^ remote: 文件 "/tmp/pip-build-env-jhoy88xq/overlay/lib/python3.12/site-packages/setuptools/build_meta.py", 第304行, in _get_build_requires remote: self.run_setup() remote: 文件 "/tmp/pip-build-env-jhoy88xq/overlay/lib/python3.12/site-packages/setuptools/build_meta.py", 第320行, in run_setup remote: exec(code, locals()) remote: 文件 "<string>", 第141行, in <module> remote: 文件 "<string>", 第110行, in get_r_c_extension_status remote: 文件 "/tmp/pip-install-a760eb7i/rpy2_c86a8ea1d3504c00a4764017850c8b04/rpy2/situation.py", 第286行, in get_r_flags remote: _get_r_cmd_config(r_home, flags, remote: 文件 "/tmp/pip-install-a760eb7i/rpy2_c86a8ea1d3504c00a4764017850c8b04/rpy2/situation.py", 第246行, in _get_r_cmd_config remote: output = subprocess.check_output( remote: ^^^^^^^^^^^^^^^^^^^^^^^^ remote: 文件 "/app/.heroku/python/lib/python3.12/subprocess.py", 第466行, in check_output remote: return run(*popenargs, stdout=PIPE, timeout=timeout, check=True, remote: ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^ remote: 文件 "/app/.heroku/python/lib/python3.12/subprocess.py", 第548行, in run remote: with Popen(*popenargs, **kwargs) as process: remote: ^^^^^^^^^^^^^^^^^^^^^^^^^^^ remote: 文件 "/app/.heroku/python/lib/python3.12/subprocess.py", 第1026行, in __init__ remote: self._execute_child(args, executable, preexec_fn, close_fds, remote: 文件 "/app/.heroku/python/lib/python3.12/subprocess.py", 第1955行, in _execute_child remote: raise child_exception_type(errno_num, err_msg, err_filename) remote: FileNotFoundError: [Errno 2] 找不到文件或目录:'/usr/lib/R/bin/R' remote: [输出结束] remote: remote: note: 该错误来自子进程,大概率不是pip的问题 remote: error: subprocess-exited-with-error remote: remote: × 获取构建wheel所需的依赖执行失败 remote: │ 退出码:1 remote: ╰─> 查看上面的输出获取更多信息 remote: remote: note: 该错误来自子进程,大概率不是pip的问题 remote: remote: ! 错误:无法使用pip安装依赖项 remote: ! remote: ! 查看上面的日志输出获取更多信息 remote: remote: ! 推送被拒绝,Python应用编译失败 remote: remote: ! 推送失败 remote: 正在验证部署... remote: remote: ! 推送被拒绝至website-name remote: 到 https://git.heroku.com/website-name.git ! [远程拒绝] main -> main (pre-receive hook declined) error: 无法推送某些引用至 'https://git.heroku.com/website-name.git'
解决方案
1. 更换适配的R Buildpack
报错核心是找不到/usr/lib/R/bin/R,说明当前R buildpack没有把R安装到预期路径。可以替换为第三方专门适配Heroku的R buildpack,它会将R安装到/app/vendor/R路径,更符合Heroku的环境规范。
2. 显式设置R_HOME环境变量
如果坚持使用当前buildpack,需要在Heroku的环境变量中设置R_HOME为实际的R安装路径。通过Heroku CLI执行:
heroku config:set R_HOME=/app/vendor/R
或在Heroku控制台的“设置”页面手动添加环境变量。
3. 调整Buildpack顺序
rpy2安装时需要R已提前存在,正确的Buildpack顺序应为Apt → R → Python,确保R先安装完成,再执行Python依赖的安装。
4. 扩展Aptfile的依赖
除r-base外,还需添加R的开发依赖,确保rpy2编译时能找到必要的头文件。在Aptfile中补充:
r-base-dev libcurl4-openssl-dev libssl-dev libxml2-dev
5. 指定兼容的版本组合
rpy2 3.5.x对Python 3.12的支持可能存在兼容性问题,建议在runtime.txt中指定Python 3.11版本,同时在requirements.txt中明确rpy2版本为rpy2==3.5.16,避免自动升级到不兼容的版本。
内容的提问来源于stack exchange,提问作者Wisteria
相关产品推荐
相关产品推荐

