So che ho creato la taglia, ma mi sono impaziente, ho deciso di indagare, e ora ho qualcosa che ha funzionato per me. Ho un pitone esempio molto simile al tuo, che praticamente fa altro che cercare di usare Tkinter per visualizzare un'immagine passata sulla linea di comando, così:
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
Quello che sta succedendo è che il file binario , ~/anaconda/envs/py35/lib/python3.5/site-packages/PIL/_imagingtk.so
è stato collegato a un framework e non alle librerie Tcl/Tk nell'env. Si può vedere questo utilizzando otool
per vedere l'impostazione di collegamento:
(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)
vedere quelle due "quadro" linee? Con anaconda non lo vogliamo. Vogliamo utilizzare le librerie nell'env. Quindi cambiamoli!
prima fare un backup del vostro binario (nel caso in cui si desidera ripristinare):
$ cp _imagingtk.so _imagingtk.so.bak
Ora eseguire questo su riga di comando (supponendo ci si trova nella stessa cartella del envname/lib
):
$ 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
Si vede che @rpath
bit in là? Ciò significa che lo si trova sul percorso. Che funziona benissimo per anaconda. Il collegamento nella biblioteca _imagingtk.so
appare come segue:
(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)
Dopo questo, il codice verrà eseguito. Qualcuno dovrebbe probabilmente cercare di ottenere questo a monte.
Addendum: legare il Tkinter nella distribuzione pitone, vale a dire, il Conda ENV attualmente attiva, ha la seguente collegamento:
~/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)
Se si preferisce, è possibile invece utilizzare install_name_tool
da usare @loader_path/../../
invece di quello che ho usato sopra, ovvero @rpath/
. Ciò funzionerà anche e potrebbe anche essere migliore.
è possibile eseguire lo stesso codice in 'IDLE' o Terminal? Se si tratta di una domanda specifica di 'anaconda', potrebbe essere necessario fornire informazioni più specifiche sulla configurazione –
Per sicurezza, stai utilizzando il PIL originale o il cuscino? –