根本原因是系统动态链接器找不到PyTorch依赖的底层C++库(如libtorch.so、libc10.so),常见于手动编译、conda非标准安装或pip/conda混用场景;现代Linux安全模式限制LD_LIBRARY_PATH生效,且Jupyter/Docker等环境可能未传递该变量,需通过ldconfig注册路径、启动前硬设LD_LIBRARY_PATH或patchelf重写rpath解决。

PyTorch 运行时报错 libtorch.so: cannot open shared object file,根本原因不是 PyTorch 没装好,而是系统动态链接器压根没找到它依赖的底层 C++ 库(libtorch.so)——这通常发生在你手动编译过 PyTorch、用 conda 安装了非标准 build、或混用了 pip/conda/torchvision 预编译包时。
为什么 LD_LIBRARY_PATH 不总管用
现代 Linux 发行版(尤其是 Ubuntu 20.04+、CentOS 8+)默认启用 ldconfig 的 secure mode,会忽略 LD_LIBRARY_PATH 中包含 ~ 或相对路径的部分;另外,如果你在 Jupyter、systemd service、或 Docker 容器里运行 Python,环境变量可能根本没传进去。
-
LD_LIBRARY_PATH只影响当前 shell 及其子进程,Python 脚本里os.environ修改它对已加载的库无效 - PyTorch 的
torch._C是 .so 扩展,在 import torch 时就完成链接,改环境变量必须在 import 前生效 - conda 环境下,PyTorch 的 libtorch 通常放在
$CONDA_PREFIX/lib,但 conda 不自动把它加进ldconfig缓存
查清 PyTorch 实际依赖哪些 .so 文件
别猜路径,直接看 Python 进程到底缺啥:
python -c "import torch; print(torch.__file__)" # 输出类似:/home/user/miniconda3/lib/python3.9/site-packages/torch/__init__.py # 接着查它的核心扩展: ldd $(python -c "import torch; print(torch._C.__file__)") | grep "not found"
常见输出如:libtorch.so => not found 或 libc10.so => not found。注意:不要只盯着 libtorch.so,libc10.so、libtorch_python.so 同样关键。
立即学习“Python免费学习笔记(深入)”;
- 如果
ldd报错说找不到torch._C,说明 PyTorch 根本没正确安装,先重装 - 若
ldd显示路径存在但标为not found,说明该路径不在系统搜索路径中 - 用
find $CONDA_PREFIX -name "libtorch.so*" 2>/dev/null或find /opt/conda -name "libtorch.so*"定位真实位置
三种真正生效的修复方式(按推荐顺序)
优先选不污染全局、不依赖 shell 环境的方式:
-
方案一(推荐):用
ldconfig注册路径 —— 对系统级部署最稳
把 PyTorch 的 lib 目录(如/home/user/miniconda3/lib)写入/etc/ld.so.conf.d/pytorch.conf,然后运行sudo ldconfig。验证:ldconfig -p | grep torch应该列出对应库 -
方案二:启动前硬编码
LD_LIBRARY_PATH—— 适合脚本或容器
不要在 Python 里os.environ["LD_LIBRARY_PATH"] = ...,而是在调用前设置:LD_LIBRARY_PATH=/path/to/torch/lib python train.py。Docker 中写成ENV LD_LIBRARY_PATH="/opt/conda/lib:${LD_LIBRARY_PATH}" -
方案三:用 patchelf 重写 rpath(仅限高级用户) —— 解决多版本共存问题
对torch/_C.cpython-*.so执行:patchelf --set-rpath '$ORIGIN/../lib' torch/_C.cpython-*.so。这样库会从自身所在目录的../lib下找依赖,彻底摆脱环境变量
最容易被忽略的是:PyTorch 的 nightly 版本、源码编译版、以及某些第三方 wheel(比如 intel-extension-for-pytorch)会把 libtorch.so 放在 torch/lib 子目录而非 CONDA_PREFIX/lib,此时必须把 torch/lib 的绝对路径加入搜索路径,而不是父目录。


















