You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

Anaconda Python中ctypes未从dlopen标准路径加载自定义OpenBLAS问题

解决Anaconda Python优先加载自定义OpenBLAS的方法

以下几种方法可以让你的自定义编译OpenBLAS优先于Anaconda自带版本被加载,无需修改Anaconda库目录:

1. 启动Python时强制置顶自定义库路径

直接在启动Anaconda Python前,将自定义OpenBLAS路径放到LD_LIBRARY_PATH最前端,覆盖Anaconda的默认路径优先级:

LD_LIBRARY_PATH=/home/username/.local/lib:$LD_LIBRARY_PATH python

如果使用conda环境,激活环境后执行上述命令即可,或者将这条命令封装成脚本方便重复使用。

2. 给conda环境添加自动路径设置

在你的conda环境目录下创建激活脚本,每次激活环境时自动将自定义路径置顶:

  • 进入conda环境的activate.d目录:
    mkdir -p ${CONDA_PREFIX}/etc/conda/activate.d
    
  • 创建set_openblas_path.sh脚本:
    echo 'export LD_LIBRARY_PATH=/home/username/.local/lib:$LD_LIBRARY_PATH' > ${CONDA_PREFIX}/etc/conda/activate.d/set_openblas_path.sh
    
  • 可选:在deactivate.d目录创建脚本恢复原路径:
    mkdir -p ${CONDA_PREFIX}/etc/conda/deactivate.d
    echo 'unset LD_LIBRARY_PATH' > ${CONDA_PREFIX}/etc/conda/deactivate.d/unset_openblas_path.sh
    

之后每次激活该conda环境,自定义路径都会自动成为LD_LIBRARY_PATH的首位。

3. 在ctypes中显式预加载自定义OpenBLAS

通过ctypes先加载自定义的OpenBLAS库并设置全局可见,后续加载你的.so时会优先使用已加载的版本:

import ctypes

# 显式加载自定义OpenBLAS,RTLD_GLOBAL让后续库可见该加载实例
custom_openblas = ctypes.CDLL("/home/username/.local/lib/libopenblas.so.0", mode=ctypes.RTLD_GLOBAL)
# 加载你的编译好的.so文件
my_shared_lib = ctypes.CDLL("/path/to/your/compiled.so")

4. 编译自定义.so时嵌入rpath路径

在编译自己的共享库时,通过-rpath参数将自定义OpenBLAS路径嵌入到库文件中,让系统优先从该路径查找依赖:

# 示例编译命令,根据实际编译工具链调整
gcc -shared -o my_compiled.so source_files.o -L/home/username/.local/lib -lopenblas -Wl,-rpath=/home/username/.local/lib

嵌入rpath后,你的.so会直接优先查找指定路径下的OpenBLAS,不受环境变量或Anaconda设置的影响。

5. 检查并调整LD_PRELOAD

如果Anaconda设置了LD_PRELOAD环境变量,将自定义OpenBLAS路径加到LD_PRELOAD最前端:

LD_PRELOAD=/home/username/.local/lib/libopenblas.so.0:$LD_PRELOAD python

该方法会强制进程优先加载指定的库,优先级高于LD_LIBRARY_PATH。

内容的提问来源于stack exchange,提问作者yli

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.08.06 03:20:59