Tôi biết tôi đã tạo ra tiền thưởng, nhưng tôi đã mất kiên nhẫn, quyết định điều tra, và bây giờ tôi đã có một cái gì đó mà làm việc cho tôi. Tôi có một ví dụ python rất giống như của bạn, trong đó khá nhiều không có gì khác hơn là cố gắng sử dụng Tkinter để hiển thị một hình ảnh thông qua trên dòng lệnh, như vậy:
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
gì đang xảy ra là nhị phân tập tin , ~/anaconda/envs/py35/lib/python3.5/site-packages/PIL/_imagingtk.so
đã được liên kết với một khung công tác chứ không phải là thư mục Tcl/Tk trong env. Bạn có thể thấy điều này bằng cách sử dụng otool
để xem thiết lập liên kết:
(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)
Xem hai dòng "khung" đó? Với anaconda chúng tôi không muốn điều đó. Chúng tôi muốn sử dụng các thư viện trong env. Vì vậy, hãy thay đổi chúng!
Đầu tiên tạo một bản sao lưu của bạn nhị phân (trong trường hợp bạn muốn trở lại):
$ cp _imagingtk.so _imagingtk.so.bak
Bây giờ chạy trên dòng lệnh (giả sử bạn đang ở trong cùng một thư mục như envname/lib
của bạn):
$ 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
Bạn thấy rằng @rpath
bit trong đó? Điều đó có nghĩa là bất kỳ điều gì bạn tìm thấy trên đường dẫn. Những công trình tuyệt vời cho anaconda. Liên kết trong thư viện _imagingtk.so
bây giờ trông giống như sau:
(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)
Sau này, mã của bạn sẽ chạy. Ai đó có lẽ nên cố gắng để có được điều này ngược dòng.
Phụ Lục: Các Tkinter ràng buộc trong việc phân phối trăn, ví dụ, hiện đang chủ động conda env, có liên kết sau đây:
~/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)
Nếu bạn thích, bạn có thay vì có thể sử dụng install_name_tool
sử dụng @loader_path/../../
thay về những gì tôi đã sử dụng ở trên, ví dụ: @rpath/
. Điều đó sẽ có lẽ cũng hoạt động và thậm chí có thể tốt hơn.
bạn có thể chạy cùng một mã trong 'IDLE' hoặc Thiết bị đầu cuối không? Nếu đây là câu hỏi cụ thể của 'anaconda', bạn có thể cần cung cấp thêm thông tin cụ thể về cách thiết lập –
Chỉ để chắc chắn, bạn có đang sử dụng PIL hoặc Gối gốc không? –