使用 Ctypes 在 Python 中加载已编译的 Matlab 共享库
Loading Compiled Matlab Shared Library in Python Using Ctypes
我正在尝试在 Python 中进行不完全 Cholesky 分解,但我找不到直接的 Python 包。
由于我在网上能找到的大部分代码都是用Matlab写的,我想绕道
- 将 matlab 代码编译为共享库(我正在使用 Mac OS 和 MATLAB_R2014a,因此它应该生成
.dylib
文件)
- 使用 Ctypes
在 Python 中加载库
详细步骤如下:
0。下载 Matlab 源代码
代码可以从F. Bach的网页link to zip file下载,包含以下文件:
panc:csi-1.0 panc25$ ls
center.m csi.dll csi.mexglx csi_gaussian.dll csi_gaussian.mexglx readme.txt
csi.c csi.m csi_gaussian.c csi_gaussian.m demo_csi.m sqdist.m
1。将 matlab 代码编译到共享库
然后按照 this post,我 运行 命令:
mcc -v -W cpplib:libcsi -T link:lib csi
大约一分钟后,终端打印 MEX completed successfully
并且在我的文件夹中有
panc:csi-1.0 panc25$ ls
center.m csi.m csi_gaussian.dll demo_csi.m libcsi.exports readme.txt
csi.c csi.mexglx csi_gaussian.m libcsi.cpp libcsi.h sqdist.m
csi.dll csi_gaussian.c csi_gaussian.mexglx libcsi.dylib mccExcludedFiles.log
其中 libcsi.dylib
是我想要的共享库。
2。在 Python
中加载库
然后我打开 IPython
并尝试加载库:
In [1]: import ctypes
In [2]: ctypes.C
ctypes.CDLL ctypes.CFUNCTYPE
In [2]: ctypes.CDLL('libcsi.dylib')
---------------------------------------------------------------------------
OSError Traceback (most recent call last)
<ipython-input-2-b6d0c1a91651> in <module>()
----> 1 ctypes.CDLL('libcsi.dylib')
/Users/panc25/anaconda/lib/python2.7/ctypes/__init__.pyc in __init__(self, name, mode, handle, use_errno, use_last_error)
363
364 if handle is None:
--> 365 self._handle = _dlopen(self._name, mode)
366 else:
367 self._handle = handle
OSError: dlopen(libcsi.dylib, 6): Library not loaded: @rpath/libmwmclmcrrt.8.3.dylib
Referenced from: /Users/panc25/Downloads/csi-1.0/libcsi.dylib
Reason: image not found
即使我将 ctypes.CDLL('libcsi.dylib')
中的文件名替换为完整路径,此问题仍然存在。
所以我很困惑。共享库是有的,但是为什么Python说"image not found"?
顺便说一句
由于源代码也通过mex.h
提供了C实现,我也尝试先创建一个.mex
文件,然后将.mex
编译成共享库如下:
panc:csi-1.0 panc25$ mex csi.c
它创建了 csi.mexmaci64
文件。然后根据this link,我调用:
panc:csi-1.0 panc25$ mcc -B csharedlib:csi2 csi.mexmaci64
生成了 csi2.dylib
个文件。
但是当我尝试在 Python 中加载它时,我遇到了同样的错误。
谁能告诉我哪里出了问题?
我会完全避免使用 Matlab,而是使用 PyMC2 中可用的不完全 Cholesky 分解:
from pymc.gp.incomplete_chol import ichol_full
可以找到 f2py 封装的 Fortran 代码,实际上是从 MEX 文件改编而来的 here。因此,如果需要,您可以独立于 PyMC2 使用它。
如果您有兴趣,也可以建议将此功能添加到 scipy(参见 githib issue)。
我正在尝试在 Python 中进行不完全 Cholesky 分解,但我找不到直接的 Python 包。
由于我在网上能找到的大部分代码都是用Matlab写的,我想绕道
- 将 matlab 代码编译为共享库(我正在使用 Mac OS 和 MATLAB_R2014a,因此它应该生成
.dylib
文件) - 使用 Ctypes 在 Python 中加载库
详细步骤如下:
0。下载 Matlab 源代码
代码可以从F. Bach的网页link to zip file下载,包含以下文件:
panc:csi-1.0 panc25$ ls
center.m csi.dll csi.mexglx csi_gaussian.dll csi_gaussian.mexglx readme.txt
csi.c csi.m csi_gaussian.c csi_gaussian.m demo_csi.m sqdist.m
1。将 matlab 代码编译到共享库
然后按照 this post,我 运行 命令:
mcc -v -W cpplib:libcsi -T link:lib csi
大约一分钟后,终端打印 MEX completed successfully
并且在我的文件夹中有
panc:csi-1.0 panc25$ ls
center.m csi.m csi_gaussian.dll demo_csi.m libcsi.exports readme.txt
csi.c csi.mexglx csi_gaussian.m libcsi.cpp libcsi.h sqdist.m
csi.dll csi_gaussian.c csi_gaussian.mexglx libcsi.dylib mccExcludedFiles.log
其中 libcsi.dylib
是我想要的共享库。
2。在 Python
中加载库然后我打开 IPython
并尝试加载库:
In [1]: import ctypes
In [2]: ctypes.C
ctypes.CDLL ctypes.CFUNCTYPE
In [2]: ctypes.CDLL('libcsi.dylib')
---------------------------------------------------------------------------
OSError Traceback (most recent call last)
<ipython-input-2-b6d0c1a91651> in <module>()
----> 1 ctypes.CDLL('libcsi.dylib')
/Users/panc25/anaconda/lib/python2.7/ctypes/__init__.pyc in __init__(self, name, mode, handle, use_errno, use_last_error)
363
364 if handle is None:
--> 365 self._handle = _dlopen(self._name, mode)
366 else:
367 self._handle = handle
OSError: dlopen(libcsi.dylib, 6): Library not loaded: @rpath/libmwmclmcrrt.8.3.dylib
Referenced from: /Users/panc25/Downloads/csi-1.0/libcsi.dylib
Reason: image not found
即使我将 ctypes.CDLL('libcsi.dylib')
中的文件名替换为完整路径,此问题仍然存在。
所以我很困惑。共享库是有的,但是为什么Python说"image not found"?
顺便说一句
由于源代码也通过mex.h
提供了C实现,我也尝试先创建一个.mex
文件,然后将.mex
编译成共享库如下:
panc:csi-1.0 panc25$ mex csi.c
它创建了 csi.mexmaci64
文件。然后根据this link,我调用:
panc:csi-1.0 panc25$ mcc -B csharedlib:csi2 csi.mexmaci64
生成了 csi2.dylib
个文件。
但是当我尝试在 Python 中加载它时,我遇到了同样的错误。
谁能告诉我哪里出了问题?
我会完全避免使用 Matlab,而是使用 PyMC2 中可用的不完全 Cholesky 分解:
from pymc.gp.incomplete_chol import ichol_full
可以找到 f2py 封装的 Fortran 代码,实际上是从 MEX 文件改编而来的 here。因此,如果需要,您可以独立于 PyMC2 使用它。
如果您有兴趣,也可以建议将此功能添加到 scipy(参见 githib issue)。