我在互联网上看到这个问题,并且我已经尝试过全部跟踪它们,但我仍然无法让PIL工作。
我尝试通过以下方式象征性地链接zlib,jpeg等库:
sudo ln -s /usr/lib/x86_64-linux-gnu/libfreetype.so /usr/lib/
sudo ln -s /usr/lib/x86_64-linux-gnu/libz.so /usr/lib/
sudo ln -s /usr/lib/x86_64-linux-gnu/libjpeg.so /usr/lib/
我尝试编辑setup.py
文件,添加以下行:
add_directory(library_dirs, "/usr/lib/x86_64-linux-gnu")
事实上,运行$ sudo python setup.py install
表明JPEG,ZLIB / PNG等支持是可用的。 (我正在为2.5和2.7安装它,两者都不工作)
sudo python2.5 setup.py install
running install
running build
running build_py
running build_ext
--------------------------------------------------------------------
PIL 1.1.7 SETUP SUMMARY
--------------------------------------------------------------------
version 1.1.7
platform linux2 2.5.6 (r256:88840, Feb 1 2012, 15:55:08)
[GCC 4.5.2]
--------------------------------------------------------------------
*** TKINTER support not available
--- JPEG support available
--- ZLIB (PNG/ZIP) support available
--- FREETYPE2 support available
--- LITTLECMS support available
但毕竟,我仍然收到decoder %s not available
错误。
我的智慧结束了。还有什么我可能错过的吗?
我的环境: 在VirtualBox VM中运行的 64位Ubuntu 11.04 。
以下是我测试PIL是否有效的方法
$ python
>>> from PIL import Image
>>> im = Image.open("photo.jpg")
>>> im.rotate(45)
Traceback (most recent call last):
File "<stdin>", line 1, in <module>
File "/usr/local/lib/python2.7/dist-packages/PIL/Image.py", line 1359, in rotate
self.load()
File "/usr/local/lib/python2.7/dist-packages/PIL/ImageFile.py", line 189, in load
d = Image._getdecoder(self.mode, d, a, self.decoderconfig)
File "/usr/local/lib/python2.7/dist-packages/PIL/Image.py", line 385, in _getdecoder
raise IOError("decoder %s not available" % decoder_name)
IOError: decoder zip not available
>>>
答案 0 :(得分:12)
与往常一样,使用包管理器:
sudo apt-get install python-imaging
它会为你处理这一切。 packages可用。
在任何Linux发行版中手动安装都是一种浪费的努力,除非这些软件包确实不存在。软件包维护人员花时间确保软件包正常工作和安装,没有必要重复他们的工作。特别是不要手动安装那些没有包装优势的东西 - 没有自动更新,不易拆卸等等......
答案 1 :(得分:2)
我已经成功地在Ubuntu 12.04中重新安装了PIL:
pip uninstall PIL
apt-get install libjpeg8 libjpeg62-dev libfreetype6 libfreetype6-dev
ln -s /usr/lib/x86_64-linux-gnu/libfreetype.so /usr/lib/
ln -s /usr/lib/x86_64-linux-gnu/libz.so /usr/lib/
ln -s /usr/lib/x86_64-linux-gnu/libjpeg.so /usr/lib/
pip install -U PIL
重新安装PIL后,它不再提升IOError: decoder zip not available
。我的错误追溯是:
Traceback (most recent call last):
File "convert_image.py", line 15, in <module>
image.save('output.png')
File "/usr/local/lib/python2.7/dist-packages/PIL/Image.py", line 1406, in save
self.load()
File "/usr/local/lib/python2.7/dist-packages/PIL/ImageFile.py", line 189, in load
d = Image._getdecoder(self.mode, d, a, self.decoderconfig)
File "/usr/local/lib/python2.7/dist-packages/PIL/Image.py", line 385, in _getdecoder
raise IOError("decoder %s not available" % decoder_name)
IOError: decoder zip not available
答案 2 :(得分:1)
尝试从头开始重新安装:
查找lib / pythonXX / site-packages / PIL。删除所有此目录以及文件PIL.pth。这应该完全删除te包。
从您下载的* tar.gz中解压缩PIL安装文件。
使用add_directory(...)添加jpeg库所在的目录,就像之前一样。 (使用ldconfig -P | grep jpeg查找库的位置)。
重试python setup.py构建,然后是python setup.py install。测试一下。
我的经历是:
不执行第2步没有重建包。 不执行第3步是根本原因。 不执行第1步可能起了作用。
这似乎是PIL安装中的一个错误,而不是Ubuntu或任何发行版的包结构。
仅供记录:在系统上安装多个Python版本是很常见的,这使得必须手动安装软件包。有些人有2.x和3.x用于实验,共享主机有2.5s,应用程序需要2.7,只是举两个例子。
答案 3 :(得分:0)
在Ubuntu上使用requirements.txt进行安装时,我发现它是上述两者的组合。我使用Vagrant运行厨师脚本,发现这种方法最适合我:
首先,我使用bash脚本来设置PIL:
#!/usr/bin/env bash
sudo apt-get build-dep python-imaging
sudo ln -s -f /usr/lib/`uname -i`-linux-gnu/libfreetype.so /usr/lib/
sudo ln -s -f /usr/lib/`uname -i`-linux-gnu/libjpeg.so /usr/lib/
sudo ln -s -f /usr/lib/`uname -i`-linux-gnu/libz.so /usr/lib/
接下来,在requirements.txt安装期间,文件的顶部如下所示:
--allow-external PIL
--allow-unverified PIL
Django==1.5.4
PIL==1.1.7
...
当然,这是一种不安全的方式,但适用于开发和快速构建。对于生产,最好手动下载并验证所有包,并从本地托管存储库安装它们。