Ich weiß, dass ich das Kopfgeld geschaffen habe, aber ich wurde ungeduldig, entschied mich zu untersuchen, und jetzt habe ich etwas, das für mich funktionierte. Ich habe ein sehr ähnliches Python Beispiel zu Ihnen, was ziemlich viel macht nichts anderes, als versuchen, Tkinter zu verwenden, um ein Bild auf der Kommandozeile, wie so übergab anzuzeigen:
calebhattingh $ python imageview.py a.jpg
objc[84696]: Class TKApplication is implemented in both /Users/calebhattingh/anaconda/envs/py35/lib/libtk8.5.dylib and /System/Library/Frameworks/Tk.framework/Versions/8.5/Tk. One of the two will be used. Which one is undefined.
objc[84696]: Class TKMenu is implemented in both /Users/calebhattingh/anaconda/envs/py35/lib/libtk8.5.dylib and /System/Library/Frameworks/Tk.framework/Versions/8.5/Tk. One of the two will be used. Which one is undefined.
objc[84696]: Class TKContentView is implemented in both /Users/calebhattingh/anaconda/envs/py35/lib/libtk8.5.dylib and /System/Library/Frameworks/Tk.framework/Versions/8.5/Tk. One of the two will be used. Which one is undefined.
objc[84696]: Class TKWindow is implemented in both /Users/calebhattingh/anaconda/envs/py35/lib/libtk8.5.dylib and /System/Library/Frameworks/Tk.framework/Versions/8.5/Tk. One of the two will be used. Which one is undefined.
Segmentation fault: 11
passiert Was ist, dass die binäre Datei , ~/anaconda/envs/py35/lib/python3.5/site-packages/PIL/_imagingtk.so
wurde mit einem Framework verknüpft und nicht mit den Tcl/Tk-Bibliotheken im env. Sie können dies sehen durch otool
mit der Verknüpfung von Setup zu sehen:
(py35) ~/anaconda/envs/py35/lib/python3.5/site-packages/PIL
calebhattingh $ otool -L _imagingtk.so
_imagingtk.so:
/System/Library/Frameworks/Tcl.framework/Versions/8.5/Tcl (compatibility version 8.5.0, current version 8.5.9)
/System/Library/Frameworks/Tk.framework/Versions/8.5/Tk (compatibility version 8.5.0, current version 8.5.9)
/usr/lib/libSystem.B.dylib (compatibility version 1.0.0, current version 159.1.0)
/usr/lib/libgcc_s.1.dylib (compatibility version 1.0.0, current version 1.0.0)
Siehst du die beiden „Rahmen“ Linien? Mit Anaconda wollen wir das nicht. Wir wollen die Bibliotheken im env verwenden. Also lass uns sie ändern!
Zuerst machen Sie eine Sicherungskopie Ihrer binary (im Fall, dass Sie zurücksetzen):
$ cp _imagingtk.so _imagingtk.so.bak
Nun ist diese laufen auf der Kommandozeile (vorausgesetzt, Sie im selben Ordner wie die envname/lib
sind):
$ install_name_tool -change "/System/Library/Frameworks/Tk.framework/Versions/8.5/Tk" "@rpath/libtk8.5.dylib" _imagingtk.so
$ install_name_tool -change "/System/Library/Frameworks/Tcl.framework/Versions/8.5/Tcl" "@rpath/libtcl8.5.dylib" _imagingtk.so
Sie sehen, dass @rpath
Bit drin? Das bedeutet, je nachdem, was Sie auf dem Pfad finden. Was gut für Anakonda funktioniert. Die Verknüpfung in der _imagingtk.so
Bibliothek sieht nun wie folgt aus:
(py35) ~/anaconda/envs/py35/lib/python3.5/site-packages/PIL
calebhattingh $ otool -L _imagingtk.so
_imagingtk.so:
@rpath/libtcl8.5.dylib (compatibility version 8.5.0, current version 8.5.9)
@rpath/libtk8.5.dylib (compatibility version 8.5.0, current version 8.5.9)
/usr/lib/libSystem.B.dylib (compatibility version 1.0.0, current version 159.1.0)
/usr/lib/libgcc_s.1.dylib (compatibility version 1.0.0, current version 1.0.0)
Danach wird Ihr Code ausführen. Jemand sollte wahrscheinlich versuchen, das upstream zu bekommen.
Nachtrag: Die Tkinter in der Python-Distribution zu binden, dh die gegenwärtig aktive Conda env, hat die folgende Verknüpfung:
~/anaconda/envs/py35/lib/python3.5/lib-dynload
calebhattingh $ otool -L _tkinter.cpython-35m-darwin.so
_tkinter.cpython-35m-darwin.so:
@loader_path/../../libtcl8.5.dylib (compatibility version 8.5.0, current version 8.5.18)
@loader_path/../../libtk8.5.dylib (compatibility version 8.5.0, current version 8.5.18)
/usr/lib/libgcc_s.1.dylib (compatibility version 1.0.0, current version 1.0.0)
/usr/lib/libSystem.B.dylib (compatibility version 1.0.0, current version 111.0.0)
Wenn Sie möchten, können Sie eher install_name_tool
verwenden @loader_path/../../
stattdessen zu verwenden von dem, was ich oben verwendet habe, dh @rpath/
. Das wird wahrscheinlich auch funktionieren, und könnte sogar besser sein.
können Sie den gleichen Code in 'IDLE' oder Terminal laufen? Wenn dies eine "anaconda" spezifische Frage ist, müssen Sie möglicherweise genauere Informationen über die Einrichtung geben. –
Nur um sicher zu sein, verwenden Sie das Original PIL oder Pillow? –