我正在尝试在Python中使用Pardiso 6稀疏求解器库。问题是我似乎无法加载Pardiso共享库(SO)。这是我打电话时遇到的错误
import ctypes
pardiso = ctypes.CDLL(pardiso_so_address)
Traceback (most recent call last):
File "test.py", line 27, in <module>
pardiso = ctypes.CDLL(lib720)
File "/home/amin/anaconda3/envs/idp/lib/python3.7/ctypes/__init__.py", line 364, in __init__
self._handle = _dlopen(self._name, mode)
OSError: ./libpardiso600-GNU720-X86-64.so: undefined symbol: sgetrf_
如果有人能对此有所了解,我将非常感激。
PS。我已经联系了Pardiso开发人员,他们告诉我我需要链接优化的BLAS,但是我已经通过conda
安装了MKL。
Update 1:我通过mkl
安装了conda
,但没有帮助。奇怪的是,我在标题中添加了import scipy
,错误消失了。如果添加import mkl
,也会发生相同的情况。因此,由于某种原因,除非手动导入scipy
或mkl
,否则.so
不知道存在lapack
安装。无论如何,现在引发了另一个错误,我认为可能与libgfortran
库有关。这是错误
Traceback (most recent call last):
File "test.py", line 34, in <module>
pardiso = ctypes.CDLL(lib720)
File "/home/amin/anaconda3/envs/test/lib/python3.7/ctypes/__init__.py", line 364, in __init__
self._handle = _dlopen(self._name, mode)
OSError: ./libpardiso600-GNU720-X86-64.so: undefined symbol: _gfortran_st_close
我仔细检查了是否安装了libgfortran
,并且确实是:
(test) PyPardisoProject$ ldconfig -p | grep libgfortran
libgfortran.so.5 (libc6,x86-64) => /lib/x86_64-linux-gnu/libgfortran.so.5
libgfortran.so.4 (libc6,x86-64) => /lib/x86_64-linux-gnu/libgfortran.so.4
[我认为类似的事情可能正在发挥作用,即库在那里,但需要触发(类似于import scipy
似乎对liblapack
所做的事情,但我不知道如何触发它。] >
[Note
:我在Pardiso网站上的C语言中找到一个示例,并通过]针对它测试了.so
文件:这是$ gcc pardiso_sym.c -o pardiso_sym -L . -lpardiso600-GNU720-X86-64 -llapack -fopenmp -lgfortran $ OMP_NUM_THREADS=1 ./pardiso_sym
并且它可以正常工作(使用我的计算机上的现有库)。因此,
.so
起作用了,只是我不知道如何通知它在Python中的依赖关系。更新2
ldd pardiso_sym
的输出:Scripts$ ldd pardiso_sym linux-vdso.so.1 (0x00007ffe7e982000) libpardiso600-GNU720-X86-64.so (0x00007f326802d000) liblapack.so.3 => /lib/x86_64-linux-gnu/liblapack.so.3 (0x00007f3267976000) libgfortran.so.4 => /lib/x86_64-linux-gnu/libgfortran.so.4 (0x00007f3267795000) libgomp.so.1 => /lib/x86_64-linux-gnu/libgomp.so.1 (0x00007f326775b000) libc.so.6 => /lib/x86_64-linux-gnu/libc.so.6 (0x00007f3267568000) libpthread.so.0 => /lib/x86_64-linux-gnu/libpthread.so.0 (0x00007f3267545000) libm.so.6 => /lib/x86_64-linux-gnu/libm.so.6 (0x00007f32673f6000) /lib64/ld-linux-x86-64.so.2 (0x00007f32685df000) libblas.so.3 => /lib/x86_64-linux-gnu/libblas.so.3 (0x00007f3267389000) libgfortran.so.5 => /lib/x86_64-linux-gnu/libgfortran.so.5 (0x00007f32670e9000) libgcc_s.so.1 => /lib/x86_64-linux-gnu/libgcc_s.so.1 (0x00007f32670cf000) libquadmath.so.0 => /lib/x86_64-linux-gnu/libquadmath.so.0 (0x00007f3267083000) libdl.so.2 => /lib/x86_64-linux-gnu/libdl.so.2 (0x00007f326707d000)
因此,我在
/lib/x86_64-linux-gnu
中添加了通用路径,即/lib64
和PATH
,并通过以下方式再次运行Python脚本:PATH=$PATH:/lib/x86_64-linux-gnu:/lib64 python padiso_script.py
但是会引发相同的错误。我也尝试过添加到
LD_LIBRARY_PATH
,但是也没有用。
我正在尝试在Python中使用Pardiso 6稀疏求解器库。问题是我似乎无法加载Pardiso共享库(SO)。这是调用import ctypes pardiso = ...
[Pardiso 6 sparse solver
至少依赖于Lapack函数sgetrf
,该函数使用具有行互换的部分数据透视来计算通用M×N矩阵A的LU分解。
根据我们的阅读,sgetrf
与共享的Lapack库动态链接。您需要提供一个包含一个实现的PATH。
Pardiso 6和Intel MKL Pardiso不兼容,因为它们具有不同的API。您可以尝试从系统路径中删除MKL,添加OpenBLAS,然后尝试再次链接您的示例。