簡體   English   中英

_imaging python PIL 中的 C 模塊錯誤

[英]_imaging C module error in python PIL

我已經閱讀了其他關於在 Mac OS X 上安裝 PIL 時臭名昭著的 _imaging C 模塊錯誤的帖子,並且在任何地方提供的解決方案(包括 PIL 常見問題解答)都沒有被證明是有用的。

我從源代碼新安裝了最新版本的 libjpeg 和 zlib。 我已經編輯了每個 Makefile 以在 LD_FLAGS 變量中包含選項 -arch i386 以用於 32 位構建。 PIL 安裝沒有任何問題,並且打印到終端的安裝摘要顯示 JPEG、TIFF 和 PNG 支持都可以。 之后我嘗試自測:

new-host:Imaging-1.1.7 ely$ python selftest.py 
*** The _imaging C module is not installed

由於各種原因,這很常見。 深入探討,這里我嘗試在python中直接導入_imaging。

new-host:Imaging-1.1.7 ely$ python
ActivePython 2.7.1.4 (ActiveState Software Inc.) based on
Python 2.7.1 (r271:86832, Feb  7 2011, 11:33:10) 
[GCC 4.2.1 (Apple Inc. build 5664)] on darwin
Type "help", "copyright", "credits" or "license" for more information.
>>> import PIL
>>> import _imaging
Traceback (most recent call last):
  File "<stdin>", line 1, in <module>
ImportError: dlopen(/Library/Frameworks/Python.framework/Versions/2.7/lib/python2.7/site-packages/PIL/_imaging.so, 2): Symbol not found: _jpeg_resync_to_restart
  Referenced from: /Library/Frameworks/Python.framework/Versions/2.7/lib/python2.7/site-packages/PIL/_imaging.so
  Expected in: dynamic lookup

再次,“找不到符號:_jpeg_resync_to_restart”是臭名昭著的常見問題,許多人認為這與 libjpeg 的路徑不正確有關。 我一遍又一遍地檢查,我只在我的主目錄中安裝了 libjpeg(以及 zlib 等),所有這些都安裝在單獨的文件夾中,來自源代碼,所有這些都在文件 setup.py 中正確標記。

所以,PIL 應該從正確的地方獲得它的 jpeg 支持(和 zlib 等)。 已安裝所有依賴項。 我可以在我的 sys.path 中看到 _imaging.so,但我仍然收到這個 _jpeg_resync_to_restart 錯誤。

有沒有不鏈接到替代帖子的想法? 我花了大約 7 個小時閱讀並嘗試從我能找到的每個論壇的帖子中找到可能的解決方案。

由於您已經嘗試過幾次,我建議您先運行一些命令來清除舊項目並從頭開始。

我在 Mac OS X、10.6 和 10.7 上使用 jpeg v8c 和 Imaging 1.1.6

將 jpeg cd 的 v8c 放入 jpeg 目錄。

sudo make clean
CC="gcc -arch i386" ./configure --enable-shared --enable-static
make
sudo make install

獲取成像我正在使用 1.1.6

將 cd 解壓到映像中

sudo rm -rf build
vi setup.py
JPEG_ROOT = libinclude(“/usr/local/lib”)
sudo python setup.py install

就這么簡單

運行 python 解釋器,

import PIL
import _imaging
import Image

如果一切都好,那么你的一切准備就緒。

這是我的博客Python 2.7、OSX Lion、PIL 和成像上的完整文章

今晚我在運行 Mac OS X v10.7.5、Python v2.7.1 和 PIL Imaging 1.1.7 和 jpeg 8d 的 Mac 上遇到了同樣的問題。


總結 - 在我的案例中成功的關鍵是:

export ARCHFLAGS="-arch x86_64"

其他答案沒有解決這個問題,我一直在得到: The _imaging C module is not installed由於: Symbol not found: _jpeg_resync_to_restart

在這里和那里挖掘終於找到了解決方案,至少對我有用:

  • 確保系統上沒有任何明顯的 libjpeg 庫: find / -iname "libjpe*"會告訴你。 我暫時改變了它們存在的地方,所以沒有人能找到它們(特別是 /sw 在我的例子中與 PIL 交互):

     mv opt opt-OFF mv sw sw-OFF

這些位置是由 mac 端口和 fink 創建的 - 請注意,在此移動之后 PIL 很可能FREETYPE2 - 如果您需要它,那么只需在這些位置重命名 libjpeg 部分。

  • 在 PIL Imaging src 目錄中編輯 setup.py 如上所述將 JPEG_ROOT 設置為 /usr/local,嘗試運行:

     rm -rf build; python setup.py build 2> /tmp/err > /tmp/log

簽入 /tmp/log - 您應該看到可用的 JPEG 支持。 您現在可以 go 進行下一步。

  • go 到 jpeg-8d src 目錄並運行:

     export ARCHFLAGS="-arch x86_64" sudo make clean; CC="gcc -arch x86_64"./configure --enable-shared --enable-static sudo make install
  • go 返回 PIL Imaging,運行以下命令:

     export ARCHFLAGS="-arch x86_64" sudo rm -rf build; python setup.py build 2> /tmp/err > /tmp/log

檢查 /tmp/log - 你現在應該看到“JPEG 支持可用”,檢查 /tmp/err - 搜索“jpeg” - 如果你看到類似這樣的內容: ld: warning: ignoring file /usr/local/lib/libjpeg.dylib, file was built for unsupported file format which is not the architecture being linked (i386) - 然后拱標志(由 ARCHFLAGS 和 -arch 設置)未能觸發 - 調查這種情況,這是至關重要的。 如果你沒有看到這個,那么你很幸運,你可以調用安裝:

export ARCHFLAGS="-arch x86_64"  
sudo rm -rf build ; sudo python setup.py install

檢查您的 PIL 是否有效:

python selftest.py

或者

echo "import _imaging" | python && echo "Works"

我希望這有幫助。

我在舊的 10.6 Mac 安裝上嘗試了所有這些建議(以及參考博客上的其他兩個建議)。 然而,他們都沒有按原樣工作,在我能夠解決我的問題的背后閱讀。 我在返回 1 行“print os.path.join(directory, include)”之前在 find_include_file() 中添加了 PIL setup.py。 這讓我能夠追蹤到哪個 libjpeg PIL 正在構建。 然后我會構建 PIL,找到它引用的 libjpeg(/sw、/opt/、/usr/local/lib 中的各種副本,...),然后刪除該 libjpeg(header 和 lib 文件)。

最后,我用一個干凈的系統構建並安裝了我自己下載的 libjpeg 源代碼壓縮包,然后從源代碼構建和安裝 PIL。 這行得通。 作為后備,您始終可以通過刪除上述文件來禁用libjpeg,否則總是從 setup.py 中的上述 function 返回零。

問題是 _imaging 模塊動態鏈接到 libjpeg,而不是靜態鏈接。 libjpeg 代碼不直接包含在 _imaging 模塊中。 這意味着您平台的動態 linker 必須能夠找到 libjpeg 才能加載和鏈接它。 我在這里的 MacOS 知識是模糊的,但我記得它的動態 linker 稱為dyld ,它的聯機幫助頁可能會提供有關您擁有的選項的更多信息。

通常,平台的動態 linker 不會在您的主目錄中查找庫 - 但您可以告訴它,例如通過設置DYLD_LIBRARY_PATH環境變量或編輯系統范圍的配置(如果有的話)。環境變量通常必須在啟動 Python 之前完成,因此它可能不適合。 您可能想嘗試將運行時搜索路徑嵌入到 _imaging 擴展模塊中,這通常通過將 -rpath 傳遞給-rpath來完成——但我不知道 MacOS 的 linker 是否提供該功能。 最后,您可以將 libjpeg 構建為static庫,而不是共享庫,並使用 _imaging 模塊鏈接。 這將避免 libjpeg 的整個共享庫情況。 對於 libjpeg,這可能是通過使用--enable-static --disable-shared運行其configure腳本來完成的。

在 Mountain Lion 10.8.2 上對我來說效果很好:

第一步 刪除所有 jpeg 包。 對於 Mac 端口:

sudo port -f uninstall jpegsudo port -f uninstall jpeg @version_here

我們需要刪除所有jpeg 版本!

第二步 刪除 PIL: pip uninstall PIL

第三步 再次安裝 jpeg package。 對於 MacPorts: sudo port install jpeg

第四步 再次安裝PIL: pip install PIL

>>> import PIL
>>> import _imaging

沒有錯誤!


如何刪除所有 jpeg 包?

$ port installed | grep -i jpeg
jpeg @8c_0
jpeg @9a_0 (active)

$ sudo port -f uninstall jpeg @8c_0
$ sudo port -f uninstall jpeg @9a_0

不關心依賴。 因為我們需要再次安裝 jpeg package:

$ sudo port install jpeg

我遇到了你們提到的所有錯誤。 我崩潰了,只是使用了 virtualenv 並安裝了 Pillow。 有效:

sudo pip install virtualenv
virtualenv python_script && cd !$
. /activate/bin
pip install Pillow

我遇到了同樣的問題,Python 2.7 和 OSX Lion,基本上遵循@AppPeL 進程並重新安裝了 libjpeg 和 PIL。 libjpeg 似乎安裝正確,PIL 似乎正確找到它,但是運行python -v然后import _imaging總是給出這個錯誤:

ImportError:dlopen(/Library/Frameworks/Python.framework/Versions/2.7/lib/python2.7/site-packages/PIL/_imaging.so,2):找不到符號:_jpeg_resync_to_restart

在使用略有不同的選項安裝和重新安裝 libjpeg(8d 版)和 PIL(1.1.7 版)二十次之后,訣竅是確保我刪除了/usr/local/include (標題)下的所有 libjpeg 文件,如以及 /user/local/lib 下的文件。

我不需要從源代碼安裝 PIL,我使用pip install pil

我一直在嘗試安裝 PIL(OS X 10.7.5,Python 2.7.3)大約 5 個小時。 我也被“找不到符號:_jpeg_resync_to_restart”錯誤所困擾,並嘗試了許多建議的解決方案都無濟於事,包括重新安裝其所有依賴項。最后,我發現了一個可雙擊安裝的Pillow

謝謝魯迪克斯! 現在“import PIL”和“import _imaging”工作!

ps 我通過我沒有專門刪除這個安裝來安裝 libjpeg,所以我不確定這是否是最終解決方案的一部分。

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM