Python ctypes не загружает динамическую библиотеку в Mac OS X - PullRequest
6 голосов
/ 14 августа 2010

У меня есть библиотека C ++ repeater.so, которую я могу загрузить из Python в Linux следующим образом:

import numpy as np                                    
repeater = np.ctypeslib.load_library('librepeater.so', '.')

Однако, когда я компилирую ту же библиотеку в Mac OS X (Snow Leopard, 32 bit) и получаю 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

Нужно ли делать что-то другое для загрузки динамической библиотеки в Python в Mac OS X?

Ответы [ 2 ]

11 голосов
/ 14 августа 2010

Вопрос не только в том, какие архитектуры доступны в dylib;это также вопрос архитектуры, в которой работает интерпретатор Python. Если вы используете поставляемый Apple Python 2.6.1 в OS X 10.6, по умолчанию он работает в 64-битном режиме, если это возможно.Поскольку вы говорите, что ваша библиотека была скомпилирована как 32-битная, вам нужно заставить Python работать в 32-битном режиме.Для Python, поставляемого Apple, один из способов сделать это - установить специальную переменную среды:

$ python -c "import sys; print sys.maxint"
9223372036854775807
$ export VERSIONER_PYTHON_PREFER_32_BIT=yes
$ python -c "import sys; print sys.maxint"
2147483647

См. Apple's man 1 python для получения дополнительной информации.

4 голосов
/ 14 августа 2010

Неа.Как говорится в сообщении об ошибке, между вашим питоном и файлом librepeater.dylib существует несоответствие архитектуры.Используйте file для проверки архитектуры librepeater.dylib;ваш питон будет построен с использованием одного из перечисленных в списке.

...