Python ctypes在Mac OS X上无法加载动态库
我有一个C++的库叫做 repeater.so
,我可以在Linux系统中用Python这样加载它:
import numpy as np
repeater = np.ctypeslib.load_library('librepeater.so', '.')
但是,当我在Mac OS X(雪豹版,32位)上编译同样的库,得到 repeater.dylib
,然后在Python中运行以下代码:
import numpy as np
repeater = np.ctypeslib.load_library('librepeater.dylib', '.')
我遇到了以下错误:
OSError: dlopen(/mydir/librepeater.dylib, 6): no suitable image found. Did find:
/mydir/librepeater.dylib: mach-o, but wrong architecture
在Mac OS X上加载动态库时,我需要做些什么不同的操作吗?
2 个回答
11
这不仅仅是关于dylib里有哪些架构的问题,还涉及到你正在使用的Python解释器的架构。如果你在OS X 10.6上使用的是苹果提供的Python 2.6.1,默认情况下它会尽量以64位模式运行。但是你提到你的库是以32位编译的,所以你需要强制Python以32位模式运行。对于苹果提供的Python,有一种方法可以做到这一点,就是设置一个特殊的环境变量:
$ python -c "import sys; print sys.maxint"
9223372036854775807
$ export VERSIONER_PYTHON_PREFER_32_BIT=yes
$ python -c "import sys; print sys.maxint"
2147483647
想了解更多信息,可以查看苹果的man 1 python
文档。
4
不行。正如错误信息所说,你的 Python 和 librepeater.dylib
文件之间存在架构不匹配的问题。你可以使用 file
命令来检查 librepeater.dylib
的架构是什么;而你的 Python 是用一个没有列出的架构来构建的。