Python ctypes没有在Mac OS X上加载动态库

时间:2010-08-14 00:40:11

标签: python linux macos ctypes dynamic-linking

我有一个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中加载动态库?

2 个答案:

答案 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将使用未列出的那个之一构建。