_在python PIL中映像C模块错误

时间:2011-05-27 08:22:51

标签: python python-imaging-library libjpeg

在Mac OS X上安装PIL时,我已经阅读了有关臭名昭着的_imaging C模块错误的其他帖子,并且在任何地方都没有提供任何解决方案,包括PIL常见问题解答,已证明有用。

我从源代码新安装了最新版本的libjpeg和zlib。我已经在每个中编辑了Makefile,以便在32位版本的LD_FLAGS变量中包含选项-arch i386。 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文件中正确标记。 / p>

所以,PIL应该从正确的位置获得jpeg支持(以及zlib等)。所有依赖项都已安装。我可以在我的sys.path中看到_imaging.so,但我仍然得到这个_jpeg_resync_to_restart错误。

是否有任何想法未链接到备用帖子?我花了大约7个小时阅读并尝试了我能找到的每个论坛中帖子的可能解决方案。

9 个答案:

答案 0 :(得分:8)

由于您已经尝试了几次,我建议先运行一些命令来清理旧项目并从头开始。

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

获取jpeg的v8c 进入jpeg目录。

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

获取成像我正在使用1.1.6

解压缩 进入成像

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 and Imaging

上的完整文章

答案 1 :(得分:4)

我今天晚上在运行Mac OS X v10.7.5,带有PIL Imaging 1.1.7和jpeg 8d的Python v2.7.1的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 ports和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支持。您现在可以进入下一步。

  • 转到jpeg-8d src目录并运行:

    export ARCHFLAGS="-arch x86_64"  
    sudo make clean; CC="gcc -arch x86_64" ./configure --enable-shared --enable-static  
    sudo make install
    
  • 返回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"

我希望这会有所帮助。

答案 2 :(得分:2)

问题是_imaging模块是动态链接到libjpeg ,而不是静态链接。 libjpeg代码不直接包含在_imaging模块中。这意味着您的平台的动态链接器必须能够找到libjpeg才能加载和链接它。我的MacOS知识模糊不清,但我记得它的动态链接器名为dyld,其联机帮助页可能会提供有关您所拥有选项的更多信息。

通常,平台的动态链接器不会在您的homedirectory中查找库 - 但您可以告诉它,例如通过设置DYLD_LIBRARY_PATH环境变量,或编辑系统范围的配置(如果有一个。)但是,在启动Python之前,通常必须设置该环境变量,因此它可能不合适。您可能希望尝试将运行时搜索路径嵌入到_imaging扩展模块中,这通常通过将-rpath传递给链接器来完成 - 但我不知道MacOS的链接器是否提供了该功能。最后,您可以将libjpeg构建为静态库,而不是共享库,并使用_imaging模块链接。这样可以避免libjpeg的整个共享库情况。对于libjpeg,这可能是通过使用configure运行其--enable-static --disable-shared脚本来完成的。

答案 3 :(得分:2)

我在旧的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(头文件和lib文件)。

最后,在一个干净的系统中,我构建并安装了我自己下载的libjpeg源代码tarball,然后从源代码构建和安装PIL。这很有效。作为后备,您可以通过删除上述文件来禁用 libjpeg,或者始终从setup.py中描述的上述函数返回零。

答案 4 :(得分:1)

适用于Mountain Lion 10.8.2:

第一步。删除所有jpeg包。对于MacPorts:

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

我们需要删除所有 jpeg版本!

第二步。删除PIL:pip uninstall PIL

第三步。再次安装jpeg包。对于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包:

$ sudo port install jpeg

答案 5 :(得分:1)

我遇到了你们提到的所有错误。我崩溃了,只是使用了virtualenv并安装了Pillow。它起作用了:

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

答案 6 :(得分:0)

我遇到了同样的问题,使用Python 2.7和OSX Lion,基本上遵循了@ApPeL流程并重新安装了libjpeg和PIL。 libjpeg似乎安装正确,PIL似乎找到了正确的,但运行python -v然后import _imaging总是给出了这个错误:

  

导入错误:   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 /下的所有libjpeg文件包括(标题),以及/ user / local / lib下的文件。

我不需要从源代码安装PIL,我使用了pip install pil

答案 7 :(得分:0)

答案 8 :(得分:0)

我一直在尝试安装PIL(OS X 10.7.5,Python 2.7.3)大约5个小时。我也陷入了'未找到符号:_jpeg_resync_to_restart'的错误,并尝试了许多提议的解决方案无济于事,包括重新安装所有依赖项。最后,我发现了Pillow的双击安装

谢谢Rudix!现在“导入PIL”和“导入_imaging”工作!

P.S。我安装了libjpeg via我没有专门删除这个安装,所以我不确定这是否是最终解决方案的一部分。