2010-08-14 10 views
6

Tengo una biblioteca de C++ repeater.so que puedo cargar desde Python en Linux de la siguiente manera:Python no ctypes cargar la biblioteca dinámica en Mac OS X

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

Sin embargo, cuando compilo la misma biblioteca en Mac OS X (Snow Leopard, 32 bits) y obtener repeater.dylib, y luego ejecute el siguiente en Python:

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

me sale el siguiente error:

OSError: dlopen(/mydir/librepeater.dylib, 6): no suitable image found. Did find: 
    /mydir/librepeater.dylib: mach-o, but wrong architecture 

¿Tengo que hacer algo diferente para cargar una biblioteca dinámica en Python en Mac OS X?

Respuesta

3

Nope. Como dice el mensaje de error, hay una falta de coincidencia de arquitectura entre su python y el archivo librepeater.dylib. Use file para verificar cuál es la arquitectura de librepeater.dylib; tu python se construirá utilizando uno de los que no figuran en la lista.

+0

El uso de 'file' hizo el truco: modifiqué la arquitectura en la configuración del compilador para que coincida con la instalación de python y ahora funciona. ¡Gracias! – nolk

+0

¿Estaba usando el Python suministrado por Apple? De ser así, podría haber ejecutado el modo de 32 bits como se sugiere. Pero recompilar funciona también. Esta también es la razón por la que los binarios en OS X generalmente se crean como archivos de arquitectura múltiple (por ejemplo, i386, x86_64 y ppc) para que los archivos, libs o aplicaciones resultantes se puedan usar en los diversos tipos de máquinas compatibles con el nivel del sistema operativo . –

10

No es solo una cuestión de qué arquitecturas están disponibles en el dylib; también es una cuestión de en qué arquitectura se está ejecutando el intérprete de Python. Si está utilizando el Python 2.6.1 suministrado por Apple en OS X 10.6, de manera predeterminada se ejecuta en modo de 64 bits si es posible. Como dices que tu biblioteca se compiló como de 32 bits, necesitarás forzar a Python para que se ejecute en modo de 32 bits. Para el pitón suministrado por Apple, una forma de hacerlo es establecer una variable de entorno especial: información

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

Sede de man 1 python por más de Apple.

+0

+1, justo en el blanco. –