前言
起因是,需要在一台没有网络的机器上跑代码,为了迁移环境直接把 conda 环境拷贝到了新机器中。但是在新机器中无法 Import librosa,会显示下面的报错信息。
Traceback (most recent call last):
File "~/miniconda3/envs/default38/lib/python3.8/site-packages/soundfile.py", line 164, in <module>
_snd = _ffi.dlopen(_full_path) # OSError if file doesn't exist or can't be loaded
OSError: cannot load library '~/miniconda3/envs/default38/lib/python3.8/site-packages/_soundfile_data/libsndfile_x86_64.so': /lib/x86_64-linuxion `GLIBC_2.29' not found (required by ~/miniconda3/envs/default38/lib/python3.8/site-packages/_soundfile_data/libsndfile_x86_64.so)
During handling of the above exception, another exception occurred:
Traceback (most recent call last):
File "~/miniconda3/envs/default38/lib/python3.8/site-packages/soundfile.py", line 170, in <module>
raise OSError('sndfile library not found using ctypes.util.find_library')
OSError: sndfile library not found using ctypes.util.find_library
During handling of the above exception, another exception occurred:
Traceback (most recent call last):
File "<stdin>", line 1, in <module>
File "~/tmp_lirbraries/librosa-0.8.0/librosa/__init__.py", line 211, in <module>
from . import core
File "~/tmp_lirbraries/librosa-0.8.0/librosa/core/__init__.py", line 6, in <module>
from .audio import * # pylint: disable=wildcard-import
File "~/tmp_lirbraries/librosa-0.8.0/librosa/core/audio.py", line 8, in <module>
import soundfile as sf
File "~/miniconda3/envs/default38/lib/python3.8/site-packages/soundfile.py", line 192, in <module>
_snd = _ffi.dlopen(_explicit_libname)
OSError: cannot load library 'libsndfile.so': libsndfile.so: cannot open shared object file: No such file or directory
正文
一开始怀疑确实是系统版本老旧,毕竟 23 年了,还在用 ubuntu 18.04,查了一下本地的 GLIBC 库是 2.27,确实版本不够 ,但是机器是在容器里,而容器的管理员也无法联系。由于之前有升级 GLIBC 库最后把机器玩崩的惨痛经历,这次能有其他选择绝对不碰 GLIBC 库。
最后的解决方式有点滑稽,通过 SSH 反向代理,有机会出一篇这个的博客,我本地的机器能够上网,反向代理 SSH 连接到容器机器,使得容器机器能访问网络了,这问题就好解决了。
试了一下下面的命令
conda install -c conda-forge libsndfile
然后一路安装完,问题就解决了,非常神奇,可能也是 conda 自主在协调库的版本吧。
后记
其实看报错还怀疑了 soundfile 库, 执行下面的命令也正常已安装。
pip install soundfile
现在想来可能就是 conda 解决了库版本依赖的问题吧。