Conda安装rpy2遇UnsatisfiableError:blas依赖冲突求助
我最近也碰到过类似的Conda依赖冲突问题,结合你的报错信息和环境详情,给你梳理下问题根源和可行的解决办法:
问题背景
我尝试在Conda环境中安装rpy2,执行命令:
conda install rpy2
但遇到了以下错误:
收集包元数据(current_repodata.json): 完成
求解环境: 失败
收集包元数据(repodata.json): 完成
求解环境: 失败
UnsatisfiableError: 发现以下规格互不兼容:
- blas
- conda-forge/linux-64::statsmodels0.10.1=py37hc1659b7_1 -> numpy[version='>=1.14.6,<2.0a0'] -> blas1.0=mkl
- conda-forge/noarch::descartes1.1.0=py_3 -> matplotlib -> numpy -> blas1.0=mkl
- conda-forge/noarch::mizani0.6.0=py_0 -> matplotlib[version='>=3.1.1'] -> numpy -> blas1.0=mkl
- conda-forge/noarch::patsy0.5.1=py_0 -> numpy[version='>=1.4.0'] -> blas1.0=mkl
- conda-forge/noarch::plotnine0.6.0=py_0 -> descartes[version='>=1.1.0'] -> matplotlib -> numpy -> blas1.0=mkl
- mkl_fft -> blas==1.0=mkl
- mkl_random -> numpy[version='>=1.14.6,<2.0a0'] -> blas==1.0=mkl
- numpy -> blas==1.0=mkl
- numpy-base -> blas==1.0=mkl
- pkgs/main/linux-64::matplotlib3.1.1=py37h5429711_0 -> numpy -> blas1.0=mkl
- pkgs/main/linux-64::pandas0.25.2=py37he6710b0_0 -> numpy[version='>=1.14.6,<2.0a0'] -> blas1.0=mkl
- scipy -> blas==1.0=mkl
我试过切换conda-forge源安装,依然出现类似的依赖冲突,但用pip安装rpy2成功了。我的Conda环境包列表如下:
# Name Version Build Channel _libgcc_mutex 0.1 main blas 1.0 mkl ca-certificates 2019.9.11 hecc5488_0 conda-forge certifi 2019.9.11 py37_0 conda-forge cycler 0.10.0 py_2 conda-forge dbus 1.13.6 he372182_0 conda-forge descartes 1.1.0 py_3 conda-forge expat 2.2.5 he1b5a44_1004 conda-forge fontconfig 2.13.1 he4413a7_1000 conda-forge freetype 2.10.0 he983fc9_1 conda-forge gettext 0.19.8.1 hc5be6a0_1002 conda-forge glib 2.58.3 h6f030ca_1002 conda-forge gst-plugins-base 1.14.5 h0935bb2_0 conda-forge gstreamer 1.14.5 h36ae1b5_0 conda-forge icu 58.2 hf484d3e_1000 conda-forge intel-openmp 2019.4 243 jpeg 9c h14c3975_1001 conda-forge kiwisolver 1.1.0 py37hc9558a2_0 conda-forge libedit 3.1.20181209 hc058e9b_0 libffi 3.2.1 hd88cf55_4 libgcc-ng 9.1.0 hdf63c60_0 libgfortran-ng 7.3.0 hdf63c60_0 libiconv 1.15 h516909a_1005 conda-forge libpng 1.6.37 hed695b0_0 conda-forge libstdcxx-ng 9.1.0 hdf63c60_0 libuuid 2.32.1 h14c3975_1000 conda-forge libxcb 1.13 h14c3975_1002 conda-forge libxml2 2.9.9 h13577e0_2 conda-forge matplotlib 3.1.1 py37h5429711_0 mizani 0.6.0 py_0 conda-forge mkl 2019.4 243 mkl-service 2.3.0 py37he904b0f_0 mkl_fft 1.0.14 py37ha843d7b_0 mkl_random 1.1.0 py37hd6b4f25_0 ncurses 6.1 he6710b0_1 numpy 1.17.2 py37haad9e8e_0 numpy-base 1.17.2 py37hde5b4d6_0 openssl 1.1.1c h516909a_0 conda-forge palettable 3.3.0 py_0 conda-forge pandas 0.25.2 py37he6710b0_0 patsy 0.5.1 py_0 conda-forge pcre 8.43 he1b5a44_0 conda-forge pip 19.3.1 py37_0 plotnine 0.6.0 py_0 conda-forge pthread-stubs 0.4 h14c3975_1001 conda-forge pyparsing 2.4.2 py_0 conda-forge pyqt 5.9.2 py37hcca6a23_4 conda-forge python 3.7.4 h265db76_1 python-dateutil 2.8.0 py37_0 pytz 2019.3 py_0 qt 5.9.7 h52cfd70_2 conda-forge readline 7.0 h7b6447c_5 scipy 1.3.1 py37h7c811a0_0 setuptools 41.4.0 py37_0 sip 4.19.8 py37hf484d3e_0 six 1.12.0 py37_0 sqlite 3.30.1 h7b6447c_0 statsmodels 0.10.1 py37hc1659b7_1 conda-forge tk 8.6.8 hbc83047_0 tornado 6.0.3 py37h516909a_0 conda-forge wheel 0.33.6 py37_0 xorg-libxau 1.0.9 h14c3975_0 conda-forge xorg-libxdmcp 1.1.3 h516909a_0 conda-forge xz 5.2.4 h14c3975_4 zlib 1.2.11 h7b6447c_3
问题根源
从报错信息能明显看出来,你当前环境里几乎所有科学计算相关的包(numpy、pandas、scipy、statsmodels等)都绑定了blas==1.0=mkl(MKL版本的BLAS库),而Conda源中的rpy2依赖的是另一种BLAS实现(比如OpenBLAS),两种BLAS库无法共存,导致Conda的依赖求解器直接报错。
可行的解决方案
方案1:直接用pip安装的rpy2(最省心)
既然你已经用pip成功安装了rpy2,完全可以继续用这个版本,但要注意两个细节:
- 确保你的系统已经安装了R的开发依赖包,比如Ubuntu下需要
r-base-dev,CentOS下需要R-devel,不然pip版的rpy2可能无法正常调用R的功能 - 后续用Conda更新其他包时,尽量用
conda update --no-deps <包名>命令,避免Conda修改底层依赖破坏rpy2的运行环境
方案2:新建独立Conda环境安装rpy2(最稳妥)
如果一定要用Conda管理rpy2,推荐新建一个干净的环境,让Conda自动处理所有依赖:
# 创建新环境,指定Python版本并默认使用conda-forge源 conda create -n rpy2_env python=3.7 -c conda-forge # 激活新环境 conda activate rpy2_env # 安装rpy2,Conda会自动匹配兼容的BLAS版本 conda install rpy2 -c conda-forge
这个方案不会污染你现有的数据分析环境,也能避免依赖冲突,后续需要用到rpy2时直接激活这个环境就行。
方案3:强制统一BLAS依赖(风险较高)
如果你不想新建环境,可以尝试把现有环境的BLAS从MKL换成OpenBLAS,但这个操作可能会导致大量包需要重新编译,风险较高,操作前一定要备份环境:
# 先备份当前环境 conda env export > environment_backup.yml # 卸载所有依赖MKL的包(谨慎执行!) conda remove --force numpy scipy pandas statsmodels matplotlib plotnine # 安装OpenBLAS版本的科学计算包 conda install numpy scipy pandas statsmodels matplotlib plotnine -c conda-forge blas=*=openblas # 最后安装rpy2 conda install rpy2 -c conda-forge
注意:这个方法可能会导致部分包出现兼容性问题,如果操作后出现异常,直接用备份的环境文件恢复:conda env create -f environment_backup.yml
额外提示
Conda的依赖冲突大多来自不同源的包依赖标准不一致,比如conda-forge和pkgs/main的包在BLAS这类底层库上经常有差异。日常使用时尽量保持环境里的包都来自同一个源,能大幅减少这类问题。
内容的提问来源于stack exchange,提问作者Make42




