在 macOS(特别是 M1/M2 芯片)使用 Python 时,可能会遇到 ImportError: Library not loaded 类错误。这通常是因为 Python 模块在加载动态库时找不到正确的 .dylib 文件。以下是一个系统化的排查与解决方法,适用于 PyAudio、PortAudio 以及其他类似情况(如 OpenCV、TensorFlow 依赖的库)。


📌 1. 问题现象

在 Python 代码或终端中运行:

python -c "import pyaudio; print(pyaudio.__version__)"

出现错误:

ImportError: dlopen(...): Library not loaded: @rpath/libportaudio.2.dylib
Reason: tried: '/Users/username/anaconda3/envs/myenv/lib/libportaudio.2.dylib' (no such file)

这表明:

  1. Python 模块(PyAudio)在导入时,找不到 libportaudio.2.dylib
  2. 可能实际安装的动态库文件名不同,如 libportaudio.dylib
  3. Python 环境中的动态库路径没有正确配置

🛠 2. 解决方案

🔍 2.1 检查当前环境中的动态库

查看 conda 环境下的库文件

cd "$(python -c 'import sys; print(sys.prefix)')/lib"
ls -l libportaudio*

如果结果显示:

libportaudio.dylib

没有 libportaudio.2.dylib,说明 PyAudio 期望的库名和实际安装的不匹配。


🔗 2.2 创建符号链接

如果 libportaudio.dylib 存在,但 libportaudio.2.dylib 缺失,创建一个符号链接:

ln -s libportaudio.dylib libportaudio.2.dylib

这可以让 Python 代码找到它需要的 libportaudio.2.dylib,但实际上指向的是 libportaudio.dylib


📌 2.3 重新安装 PortAudio 和 PyAudio

如果 libportaudio.dylib 也不存在,说明 PortAudio 可能未正确安装,可以先移除并重新安装:

conda remove pyaudio portaudio
conda install -c conda-forge portaudio pyaudio

然后再次检查 libportaudio.dylib 是否存在,并重复 2.12.2


🧰 2.4 让 Python 识别库路径

如果 ln -s 无法解决问题,可以手动设置动态库路径,让 Python 在运行时能找到正确的库:

export DYLD_LIBRARY_PATH="$(python -c 'import sys; print(sys.prefix)')/lib:$DYLD_LIBRARY_PATH"

可以将这条命令加入 ~/.zshrc 以便每次启动终端时自动生效:

echo 'export DYLD_LIBRARY_PATH="$(python -c '\''import sys; print(sys.prefix)'\''')/lib:$DYLD_LIBRARY_PATH"' >> ~/.zshrc
source ~/.zshrc

✅ 2.5 测试 PyAudio

运行以下命令确认问题是否解决:

python -c "import pyaudio; print(pyaudio.__version__)"

如果不再报错,并成功输出版本号,说明问题已经修复。


📌 3. 适用范围

这个问题不仅适用于 PyAudio,也适用于 OpenCV、TensorFlow、Pandas 及其他依赖动态库的 Python 模块,如:

  • ImportError: dlopen(...): Library not loaded: @rpath/libopencv_core.4.dylib
  • ImportError: Library not loaded: @rpath/libtensorflow_framework.2.dylib

通用解决方案:

  1. 检查 lib 目录是否存在相关 .dylib 文件
  2. 使用 ln -s 创建符号链接
  3. 使用 export DYLD_LIBRARY_PATH 确保 Python 运行时能找到库

🔖 4. 总结

步骤 命令 作用
1 cd "$(python -c 'import sys; print(sys.prefix)')/lib" && ls -l libportaudio* 查看是否缺少 .dylib
2 ln -s libportaudio.dylib libportaudio.2.dylib 创建符号链接
3 conda remove pyaudio portaudio && conda install -c conda-forge portaudio pyaudio 重新安装库
4 export DYLD_LIBRARY_PATH="$(python -c 'import sys; print(sys.prefix)')/lib:$DYLD_LIBRARY_PATH" 让 Python 识别库
5 python -c "import pyaudio; print(pyaudio.__version__) 测试是否修复

如果你未来在 macOS 上遇到类似的问题,可以优先尝试这个流程,基本上可以解决 90% 以上的 Library not loaded 问题。


💡 触类旁通

  • 适用于 所有 Python 依赖 C 动态库(.dylib)的模块
  • 适用于 macOS M1/M2 以及部分 Intel Mac
  • 适用于 Python venv / conda 环境

📌 重点记住

  1. 先检查 .dylib 文件是否存在
  2. 确保 Python 运行时能找到 .dylib
  3. 适当使用 ln -s 修正库文件名称不匹配