Python ctypes未在Mac OS X上加载动态库 我有一个C++库中继器,所以 >我可以从Linux中的python加载如下: import numpy as np repeater = np.ctypeslib.load_library('librepeater.so', '.')

Python ctypes未在Mac OS X上加载动态库 我有一个C++库中继器,所以 >我可以从Linux中的python加载如下: import numpy as np repeater = np.ctypeslib.load_library('librepeater.so', '.'),python,linux,macos,ctypes,dynamic-linking,Python,Linux,Macos,Ctypes,Dynamic Linking,但是,当我在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 s

但是,当我在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中的动态库需要做些不同的事情吗?

不需要。正如错误消息所说,python和
librepeater.dylib
文件之间存在架构不匹配。使用
file
检查
librepeater.dylib
的体系结构;您的python将使用未列出的python之一构建。

这不仅仅是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

有关更多信息,请参阅苹果的
man1python

使用
file
成功:我修改了编译器设置中的体系结构以匹配python安装,现在它可以工作了。谢谢您使用的是苹果提供的Python吗?如果是这样,您可以按照建议在32位模式下运行。但重新编译也能起作用。这也是为什么OS X上的二进制文件通常构建为多体系结构文件(例如,i386、x86_64和ppc),因此生成的文件、lib或应用程序可以在OS级别支持的各种机器上使用。