7

我已经阅读了其他关于在 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 个小时阅读并尝试从我能找到的每个论坛的帖子中找到可能的解决方案。

4

9 回答 9

8

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

我在 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 和 Imaging上的完整文章

于 2011-07-27T14:30:04.763 回答
4

今晚我在运行 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 创建的 - 请注意,FREETYPE2在此移动之后 PIL 很可能找不到这些位置 - 如果您需要它,那么只需在这些位置重命名 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 support available”,检查 /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"

我希望这有帮助。

于 2012-10-02T22:04:43.220 回答
2

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

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

于 2011-05-27T09:41:27.500 回答
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 源代码压缩包,然后从源代码构建和安装 PIL。这行得通。作为后备,您始终可以通过删除上述文件来禁用libjpeg,否则总是从 setup.py 中的上述函数返回零。

于 2012-10-28T23:27:00.780 回答
1

在 Mountain Lion 10.8.2 上对我来说效果很好:

第一步。删除所有 jpeg 包。对于 Mac 端口:

sudo port -f uninstall jpeg或者sudo port -f uninstall jpeg @version_here

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

第二步。删除 PIL:pip uninstall PIL

第三步。再次安装 jpeg 包。对于 Mac 端口: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
于 2013-03-14T19:47:48.533 回答
1

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

sudo pip install virtualenv
virtualenv python_script && cd !$
. /activate/bin
pip install Pillow
于 2016-01-21T08:18:23.273 回答
0

我在使用 Python 2.7 和 OSX Lion 时遇到了同样的问题,并且基本上遵循 @ApPeL 流程并重新安装了 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

于 2012-04-25T10:37:36.150 回答
0

这对我有用-http ://www.thetoryparty.com/2010/08/31/pil-on-snow-leopard-_jpeg_resync_to_restart-error/

于 2012-10-01T05:33:30.923 回答
0

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

谢谢鲁迪克斯!现在“import PIL”和“import _imaging”工作!

ps 我通过我没有专门删除这个安装来安装 libjpeg ,所以我不确定这是否是最终解决方案的一部分。

于 2013-03-25T16:54:12.170 回答