在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个小时阅读并尝试了我能找到的每个论坛中帖子的可能解决方案。
答案 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
如果一切顺利,那么你的全部设定。
上的完整文章答案 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 jpeg
或sudo 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)