Ich baue ein Python-Modul aus C++ - Dateien, mit swig, und ich habe auch eine lokale Erstellung von Python 2.7 in meinem Home-Verzeichnis, auf OSX 10.8. Ich möchte mit meinem lokalen Python bauen, aber osx hat ein System Python, und das verursacht einige Probleme. Ich erhalte die folgenden FehlerImpose Verknüpfung zu bestimmten Python-Bibliothek auf OSX Lion
>>> import example
Fatal Python error: PyThreadState_Get: no current thread
Abort trap: 6
, die nach der Umgebung Surfen, sind es wegen meines Python ausführen, aber die Modul Verknüpfung gegen das System Python.
entfalten ich ein kleines swig Beispiel as from tutorial und dann verknüpft als
gcc -shared -I builddir/include/python2.7/ example.c example_wrap.c \
-o _example.so -L builddir/lib/python2.7/ -lpython2.7
Sicher genug folgt, hält die _example.so gegen das System Python-Bindung, wahrscheinlich, weil Frameworks zuerst in der Auflösung kommen, obwohl ich Ich bin mir nicht sicher, ob dies zur Zeit der Verknüpfung oder zur Ausführungszeit ist.
_example.so:
_example.so (compatibility version 0.0.0, current version 0.0.0)
/System/Library/Frameworks/Python.framework/Versions/2.7/Python (compatibility version 2.7.0, current version 2.7.2)
/usr/lib/libSystem.B.dylib (compatibility version 1.0.0, current version 169.3.0)
Wie kann ich es zwingen, gegen meine eigene Python-Bibliothek zu binden?
bearbeiten: ich erfolgreich geschafft, es, indem Sie eine
install_name_tool -change
/System/Library/Frameworks/Python.framework/Versions/2.7/Python
@executable_path/../lib/libpython2.7.dylib
importieren zu machen, aber es fühlt sich an wie ein Hack. Kann ich nicht einfach den Linker die Bibliothek für mich finden lassen und die entsprechende Referenz darin einfügen? Kann ich nicht einfach den Bibliotheksnamen (libpython2.7.dylib) angeben und ihn zur Laufzeit wie unter Linux auflösen lassen?
Da es kein ldconfig Equivalent für dyld gibt (oder die Fähigkeit, beliebige neue Pfade systemweit für dyld hinzuzufügen, um neue Librarys zu 'holen'), wette ich, dass das install_name_tool-Ding am ehesten zu einer Lösung kommt, die nicht funktioniert (1) die Installation in Systembibliothekspfade (/ lib,/usr/lib) oder DYLD_ * -Umgebungsvariablen Eine andere Lösung wäre die Verknüpfung mit einer statischen Python-Bibliothek (.a) – synthesizerpatel
hatte kürzlich das gleiche Problem mit einem einfachen Cython Extension in virtualenv, es früher zu arbeiten (Osx 10.7), nicht sicher, was sich geändert hat, würde also gerne die autoritative Antwort wissen PS Ich habe eine Hack-Lösung gesehen, wo das Ziel '.dylib' umbenannt wurde nur so, dass die die richtige Version könnte mit ... –
verknüpft werden Ich würde vorschlagen, dies in einem virtualenv versuchen, aber es ist interessant, dass @qarma hat ein ähnliches Problem dort. – cm2