2013-11-15 8 views
5

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?

+1

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

+0

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 ... –

+0

verknüpft werden Ich würde vorschlagen, dies in einem virtualenv versuchen, aber es ist interessant, dass @qarma hat ein ähnliches Problem dort. – cm2

Antwort

1

Sie müssen die Lösung testen, weil ich es nicht tan Maschine OSX muß hier testen, aber ich denke, das ist Ihr Problem lösen kann:

ein Skript ausführen und ändern (eine oder bearbeiten) Ihr Alias ​​oder Ihre PATH-Variable:

alias python='/your/local/python' 
PATH=/your/local/python:$PATH 

# Run your app here 

Lassen Sie mich wissen, ob dies hilft.

Verwandte Themen