Jupyter中rpy2运行异常,寻求Conda兼容解决方案
问题:Conda环境中rpy2调用失败,R版本不匹配导致错误
我的想法
不确定这是Conda问题还是rpy2问题。
环境背景
- 操作系统:MS Windows 11 Pro
- Anaconda版本:22.9.0
- Python版本:3.7.16
- R-base版本:3.6.1(Conda环境内安装)
- 已安装的辅助包:
- numpy 1.23.5
- scipy 1.10.0
- opencv 4.6.0
- matplotlib 3.6.2
- rpy2版本:2.9.4(Conda安装)
复现步骤与错误信息
执行环境检测代码
import rpy2 import rpy2.situation for row in rpy2.situation.iter_info(): print(row)
输出结果与错误
输出显示rpy2实际检测到的版本为3.5.11,Python版本为3.9.16(与Conda环境的3.7.16不符),且R版本调用了系统安装的R-4.2.2和R-4.1.3,而非Conda环境内的R-3.6.1:
rpy2 version: 3.5.11 Python version: 3.9.16 (main, Jan 11 2023, 16:16:36) [MSC v.1916 64 bit (AMD64)] Looking for R's HOME: Environment variable R_HOME: None InstallPath in the registry: C:\Program Files\R\R-4.2.2 Environment variable R_USER: None Environment variable R_LIBS_USER: None R version: In the PATH: R version 4.1.3 (2022-03-10) -- "One Push-Up" Copyright (C) 2022 The R Foundation for Statistical Computing Platform: x86_64-w64-mingw32/x64 (64-bit) R is free software and comes with ABSOLUTELY NO WARRANTY. You are welcome to redistribute it under the terms of the GNU General Public License versions 2 or 3. For more information about these matters see https://www.gnu.org/licenses/. Loading R library from rpy2: OK Additional directories to load R packages from: None C extension compilation: Warning: Unable to get R compilation flags. Directory for the R shared library:
随后抛出错误:
--------------------------------------------------------------------------- CalledProcessError Traceback (most recent call last) Cell In[14], line 5 2 import rpy2 4 import rpy2.situation ----> 5 for row in rpy2.situation.iter_info(): 6 print(row) File c:\Users\username\.conda\envs\this_env_name\lib\subprocess.py:528, in run(input, capture_output, timeout, check, *popenargs, **kwargs) 526 retcode = process.poll() 527 if check and retcode: --> 528 raise CalledProcessError(retcode, process.args, 529 output=stdout, stderr=stderr) 530 return CompletedProcess(process.args, retcode, stdout, stderr) CalledProcessError: Command '('C:\\Program Files\\R\\R-4.2.2\\bin\\x64\\R', 'CMD', 'config', 'LIBnn')' returned non-zero exit status 1.
导入rpy2.robjects时的错误
执行代码:
import rpy2.robjects
抛出错误:
R[write to console]: Error in gettext(fmt, domain = domain, trim = trim) : 3 arguments passed to .Internal(gettext) which requires 2 --------------------------------------------------------------------------- RRuntimeError Traceback (most recent call last) Cell In[16], line 4 1 # 2 import rpy2 ----> 4 import rpy2.robjects File c:\Users\username\.conda\envs\this_env_name\lib\site-packages\rpy2\rinterface.py:817, in SexpClosure.__call__(self, *args, **kwargs) 810 res = rmemory.protect( 811 openrlib.rlib.R_tryEval( 812 call_r, 813 call_context.__sexp__._cdata, 814 error_occured) 815 ) 816 if error_occured[0]: --> 817 raise embedded.RRuntimeError(_rinterface._geterrmessage()) 818 return res RRuntimeError: Error in gettext(fmt, domain = domain, trim = trim) : 3 arguments passed to .Internal(gettext) which requires 2
关键观察
系统未调用Conda环境内的R-3.6.x版本,反而调用了系统全局安装的R-4.2.2和R-4.1.3;同时rpy2版本和Python版本与Conda环境配置不符,说明环境存在冲突。
需求
在不破坏现有Conda环境的前提下,实现Jupyter中rpy2正常运行,完成Python调用R脚本、处理对象并返回结果的功能。
解决方案
1. 强制指定Conda环境内的R路径
在Jupyter notebook开头添加以下代码,设置R_HOME环境变量指向Conda环境内的R安装路径:
import os # 替换为你的Conda环境路径 os.environ['R_HOME'] = r'C:\Users\username\.conda\envs\this_env_name\Lib\R' os.environ['PATH'] = r'C:\Users\username\.conda\envs\this_env_name\Lib\R\bin\x64;' + os.environ['PATH']
2. 重新安装匹配版本的rpy2
Conda环境内的R-3.6.1需要匹配兼容的rpy2版本,rpy2 2.9.x确实兼容R 3.6,但需确保是通过Conda安装且未被pip版本覆盖:
- 先卸载现有rpy2:
conda remove rpy2 - 清理可能残留的pip安装版本:
pip uninstall rpy2 -y - 重新安装指定版本的rpy2:
conda install rpy2=2.9.4 -c conda-forge
3. 配置Jupyter内核指向正确的Conda环境
确保Jupyter使用的是目标Conda环境的内核:
- 激活目标环境:
conda activate this_env_name - 安装ipykernel并注册内核:
conda install ipykernel python -m ipykernel install --user --name=this_env_name - 在Jupyter中切换到
this_env_name内核运行代码。
4. 验证环境一致性
重新运行检测代码,确认输出的Python版本、rpy2版本、R版本均与Conda环境配置一致:
import sys import rpy2 import rpy2.situation print(f"Python version: {sys.version}") print(f"rpy2 version: {rpy2.__version__}") for row in rpy2.situation.iter_info(): print(row)
内容的提问来源于stack exchange,提问作者EngrStudent
相关产品推荐
相关产品推荐

