You need to enable JavaScript to run this app.
最新活动
大模型
产品
解决方案
定价
生态与合作
支持与服务
开发者
了解我们

Conda安装rpy2遇UnsatisfiableError:blas依赖冲突求助

解决Conda安装rpy2时的UnsatisfiableError依赖冲突问题

我最近也碰到过类似的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

火山引擎 最新活动