Docker容器中使用R的reticulate调用Python失败问题排查
问题
我基于rocker/shinyverse:4.2.2构建Docker镜像,Dockerfile内容如下:
# File: Dockerfile FROM rocker/shiny-verse:4.2.2 RUN echo "apt-get start" RUN apt-get update && apt-get install -y \ python3 \ python3-pip # install R packages RUN R -e "install.packages('remotes')" RUN R -e "install.packages('reticulate')" RUN R -e "install.packages('tidyverse')" # Install Python packages datetime and zeep RUN python3 -m pip install datetime zeep # Set the environment variable to use Python3 ENV RETICULATE_PYTHON /usr/bin/python3
我编写了如下简单R脚本:
library("tidyverse") library(reticulate) # Call a simple Python command to calculate 3*5 py_run_string("z = 3+4") py$z %>% print()
启动容器后,执行命令:
docker exec shiny_new Rscript /home/shiny/ETL/reticulate_test.R
但出现错误:
Error: Python shared library not found, Python bindings not loaded. Use reticulate::install_miniconda() if you'd like to install a Miniconda Python environment. Execution halted
不清楚如何正确配置Python以在R脚本中通过reticulate调用Python,请问Docker镜像配置哪里出错了?
解决方法
- 问题根源:仅安装
python3和python3-pip不足以让reticulate正常工作,缺少Python共享库文件——reticulate依赖该库实现R与Python的交互。在Debian/Ubuntu系镜像中,Python共享库包含在python3-dev包内。 - 修正步骤:
- 修改Dockerfile,在
apt-get install的依赖列表中添加python3-dev:RUN apt-get update && apt-get install -y \ python3 \ python3-pip \ python3-dev - 额外优化:
datetime是Python标准库,无需通过pip安装,可移除该安装项,精简依赖:RUN python3 -m pip install zeep - 重新构建镜像并启动容器:
docker build -t shiny_new . docker run -d --name shiny_new shiny_new - 再次执行测试脚本,reticulate即可正常调用Python。
- 修改Dockerfile,在
内容的提问来源于stack exchange,提问作者Jochem
相关产品推荐
相关产品推荐

