2010-08-14 9 views
6

Ich habe eine C++ Bibliothek repeater.so, die ich von Python in Linux die folgende Art und Weise laden:Python ctypes Laden nicht dynamische Bibliothek auf Mac OS X

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

Allerdings, wenn ich kompilieren die gleiche Bibliothek auf Mac OS X (Snow Leopard, 32 Bit) und erhalten repeater.dylib, und dann den folgenden in Python ausführen:

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

ich erhalte die folgende Fehlermeldung:

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

Muss ich etwas anderes tun, um eine dynamische Bibliothek in Python unter Mac OS X zu laden?

Antwort

3

Nein. Wie die Fehlermeldung sagt, gibt es einen Architekturkonflikt zwischen Ihrem Python und librepeater.dylib Datei. Verwenden Sie file, um zu überprüfen, wie die Architektur von librepeater.dylib ist; Ihr Python wird mit einem der nicht aufgeführten erstellt.

+0

Mit 'file' gelang der Trick: Ich habe die Architektur in den Compilereinstellungen an die Python-Installation angepasst und jetzt funktioniert es. Vielen Dank! – nolk

+0

Haben Sie das von Apple gelieferte Python verwendet? Wenn ja, könnten Sie wie vorgeschlagen im 32-Bit-Modus laufen. Aber auch das Neukompilieren funktioniert. Aus diesem Grund werden Binärdateien unter OS X in der Regel als Multi-Architecture-Dateien (z. B. i386, x86_64 und ppc) erstellt, sodass die resultierenden Dateien, Bibliotheken oder Anwendungen auf den verschiedenen von der Betriebssystemebene unterstützten Maschinen verwendet werden können . –

10

Es ist nicht nur eine Frage, welche Architekturen in der Dylib verfügbar sind; Es kommt auch darauf an, in welcher Architektur der Python-Interpreter läuft. Wenn Sie das von Apple gelieferte Python 2.6.1 in OS X 10.6 verwenden, wird es standardmäßig im 64-Bit-Modus ausgeführt. Da Sie sagen, dass Ihre Bibliothek als 32-Bit kompiliert wurde, müssen Sie Python zwingen, im 32-Bit-Modus zu laufen. Für den von Apple bereitgestellten Python, eine Art und Weise zu tun, ist eine spezielle Umgebungsvariable zu setzen:

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

See Apple man 1 python für weitere Informationen.

+0

+1, direkt am Ziel. –