_python PIL中的映像C模块错误

2024-04-26 21:40:55 发布

您现在位置:Python中文网/ 问答频道 /正文

我读过其他关于在MacOSX上安装PIL时出现的臭名昭著的成像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中导入图像。

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

这里再次强调,“找不到符号:重新同步到重新启动”是臭名昭著且常见的,许多人认为这与libjpeg的错误路径有关。我一次又一次地检查,我只在我的主目录中安装了libjpeg(以及zlib等),所有这些都在单独的文件夹中,从源文件,所有这些都在文件setup.py中正确标记。

因此,PIL应该从正确的地方获得jpeg支持(和zlib等)。所有依赖项都已安装。我可以在sys.path中看到imaging.so,但仍然会出现这个jpeg重新同步到重新启动错误。

有没有不链接到其他帖子的想法?我花了大约7个小时阅读并尝试从每个论坛的帖子中找到可能的解决方案。


Tags: 文件pyhostnewpilso地方错误
2条回答

问题是,图像处理模块与libjpeg动态链接,而不是静态链接。libjpeg代码不直接包含在成像模块中。这意味着您平台的动态链接器必须能够找到libjpeg才能加载和链接它。我在这里的MacOS知识是模糊的,但我记得它的动态链接器叫做dyld,它的手册页可能会提供更多关于您所拥有的选项的信息。

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

今天晚上,我在运行macosxv10.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 libs:find / -iname "libjpe*"将告诉您这一点。我暂时改变了它们存在的位置,这样就没人能找到它们(特别是/sw在我的案例中与PIL交互):

    mv opt opt-OFF  
    mv sw sw-OFF  
    

这些位置是由mac端口和fink创建的-请注意,在这次移动之后,PIL很可能找不到FREETYPE2如果需要,请重命名这些位置中的libjpeg部分。

  • 如前所述,在PIL Imaging src directory edit 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)-然后arch flags(由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"

我希望这能有帮助。

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

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

获取jpeg的v8c cd到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

相关问题 更多 >