reticulate 看不到 conda 环境中的系统库

Kir*_*-CO 6 python r libstdc++ conda reticulate

我正在尝试reticulate使用 RStudio Server v1.2.5042 以及使用conda. 当我使用 启动 Python 作业时reticulate,出现错误,指出某些系统库的版本不正确,特别libstdc++.so.6是 和libz.so.1

首先,我意识到 CentOS 7.8 有点旧,一些问题可以通过升级操作系统来解决,但在这种情况下这不是一个选择。

conda环境确实有效,我可以在终端窗口中运行目标 Python 脚本,不会出现任何错误。在RStudio中使用reticulate,此时代码非常简单:

   library(reticulate)
   use_condaenv('test')
   py_run_file('test_script.py')
Run Code Online (Sandbox Code Playgroud)

当脚本运行时,我收到以下错误:

ImportError: /lib64/libstdc++.so.6: version `GLIBCXX_3.4.21' not found (required by /home/<user>/.conda/envs/test/lib/python3.8/site-packages/scipy/_lib/_uarray/_uarray.cpython-38-x86_64-linux-gnu.so)

当我查看/usr/lib64目录时,我发现libstdc++.so,但运行strings libstdc++.so | grep ^GLIBC | sort显示它确实不支持 version GLIBCXX 3.4.21。没有什么惊喜。如果我导航到该/home/<user>/.conda/envs/test/lib目录,我会找到另一个副本libstdc++.so.6,并且这个副本确实支持 version GLIBCXX 3.4.21。因此,正确的环境目录中存在正确版本的库conda,但由于某种原因 RStudioreticulate找不到它。

我尝试更改LD_LIBRARY_PATHconda首先列出环境目录,但这不起作用。我在这里找到了一个冗长的讨论,其中指出这LD_LIBRARY_PATH并不是一个真正好的解决方案,除非它是在 RStudio 进程初始化之前设置的。(然后就使用哪个版本的 Python 进行了切线。)对于我的情况,可能需要conda支持多个环境,并且不可能知道哪个环境对于任何给定会话以及我使用的任何给定用户将是活动的不同/多个环境。我宁愿不尝试将所有conda环境协调成一个大的超级环境。

我还验证了 Python 版本和其他库是否设置正确:

python:         /home/<user>/.conda/envs/test/bin/python
libpython:      /home/<user>/.conda/envs/test/lib/libpython3.8.so
pythonhome:     /home/<user>/.conda/envs/test:/home/<user>/.conda/envs/test
version:        3.8.5 (default, Aug  5 2020, 08:36:46)  [GCC 7.3.0]
numpy:          /home/<user>/.conda/envs/test/lib/python3.8/site-packages/numpy
numpy_version:  1.19.1

NOTE: Python version was forced by use_python function
Run Code Online (Sandbox Code Playgroud)

我已经能够通过重置链接以/usr/lib64指向conda目录中的副本来运行它。虽然这使它适用于此实例,但我不确定是否要将这样的修复推送到生产中。我的猜测是,如果我链接到所有conda环境中最具包容性的库版本,并且该版本完全支持系统级库支持的所有版本,一切都会好起来的,但这充其量就像是一个黑客。

如果有人找到了一个好的解决方案,我将很高兴了解详细信息。

Bei*_*nje 2

在与类似的问题斗争了几天之后,并尝试了网络上的许多建议的解决方案(主要基于符号链接、LD_LIBRARY_PATH变量或安装/升级/降级软件包,如libgcc),我终于找到了这里只提到一次的东西: https: //github.com/rstudio/reticulate/issues/338#issuecomment-415472406

R当安装在操作系统(apt-get r-base例如)而不是(Ana/Mini)conda 上时,问题可能似乎是冲突。在这种情况下,它将尝试加载系统库而不是 conda 环境库。

因此,对于仍然遇到此类问题的人来说,这是一个可能的解决方案,对我有用:

  1. (也许是可选的)R在本地系统上卸载:apt-get remove r-base r-base-dev
  2. 激活conda环境:conda activate my_R_env
  3. 在此环境中安装 R:conda install r r-essentials --channel conda-forge
  4. 在同一环境中安装像 reticulate 这样的 R 包:conda install r-reticulate --channel conda-forge

您可以检查 conda 环境中安装的 Python 包现在是否已正确加载reticulate

  • R
  • > library(reticulate)
  • > repl_python()
  • >>> import pandas或任何导致初始问题的软件包

注意:由于 R 加载基础 conda 环境而不是激活的环境,我仍然遇到一些问题,但停用/重新激活环境或调用use_condaenv('my_R_env')似乎可以解决问题。