我有一个C ++库repeater.so
,我可以通过以下方式从Linux加载Python:
import numpy as np
repeater = np.ctypeslib.load_library('librepeater.so', '.')
然而,当我在Mac OS X(Snow Leopard,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上,我是否必须采取不同的方法在Python中加载动态库?
答案 0 :(得分:11)
这不仅仅是dylib中可用的架构问题;它也是Python解释器运行的体系结构的问题。如果你在OS X 10.6中使用Apple提供的Python 2.6.1,默认情况下它会尽可能以64位模式运行。既然你说你的库被编译为32位,你需要强制Python以32位模式运行。对于Apple提供的Python,一种方法是设置一个特殊的环境变量:
$ python -c "import sys; print sys.maxint"
9223372036854775807
$ export VERSIONER_PYTHON_PREFER_32_BIT=yes
$ python -c "import sys; print sys.maxint"
2147483647
有关详细信息,请参阅Apple的man 1 python
。
答案 1 :(得分:4)
不。正如错误消息所示,您的python和librepeater.dylib
文件之间存在体系结构不匹配。使用file
检查librepeater.dylib
的体系结构是什么;你的python将使用未列出的那个之一构建。