IOError: “el decodificador zip no está disponible” al usar matplotlib PNG en ReportLab en Linux, funciona en Windows

Estoy usando ReportLab para imprimir un gráfico producido por matplotlib.

Puedo hacer esto en mi máquina de desarrollo de Windows sin problemas. Sin embargo, cuando implemento en un servidor Ubuntu, la representación falla con el error descrito. Supongo que me estoy perdiendo un módulo de Python, pero no sé cuál. Creo que las versiones de Python, matplotlib, ReportLab y PIL son las mismas tanto en mi máquina de desarrollo como en el servidor.

Código para convertir la figura de matplotlib (denominada tabla) a PNG y devolverla:

img_stream = StringIO.StringIO() chart.savefig(img_stream, format = 'png') img_stream.seek(0) return img_stream 

Código para utilizar la imagen:

  res_img = charts.CreateProjectionChart(doc.fund) #calls above code if res_img: img = ImageReader(res_img) canvas.drawImage(img, FromLeft(first_col), FromTop(3.5, 2), width - (.1 * inch), 1.75 * inch, preserveAspectRatio=True, anchor='c') 

Cuando se ejecuta en Windows, esto funciona. Cuando se ejecuta en Linux produce este error:

  File "/home/web-server/reports.py", line 913, in FirstPageSetup canvas.drawImage(img, FromLeft(first_col), FromTop(3.5, 2), width - (.1 * inch), 1.75 * inch, preserveAspectRatio=True, anchor='c') File "/usr/local/lib/python2.7/dist-packages/reportlab-2.5-py2.7-linux-x86_64.egg/reportlab/pdfgen/canvas.py", line 840, in drawImage rawdata = image.getRGBData() File "/usr/local/lib/python2.7/dist-packages/reportlab-2.5-py2.7-linux-x86_64.egg/reportlab/lib/utils.py", line 658, in getRGBData annotateException('\nidentity=%s'%self.identity()) File "/usr/local/lib/python2.7/dist-packages/reportlab-2.5-py2.7-linux-x86_64.egg/reportlab/lib/utils.py", line 648, in getRGBData if Image.VERSION.startswith('1.1.7'): im.load() File "/usr/local/lib/python2.7/dist-packages/PIL-1.1.7-py2.7-linux-x86_64.egg/ImageFile.py", line 189, in load d = Image._getdecoder(self.mode, d, a, self.decoderconfig) File "/usr/local/lib/python2.7/dist-packages/PIL-1.1.7-py2.7-linux-x86_64.egg/Image.py", line 385, in _getdecoder raise IOError("decoder %s not available" % decoder_name) IOError: decoder zip not available identity=[ImageReader@0x30336d0] handle_pageBegin args=() 

Aparentemente, PIL setup.py no sabe cómo encontrar libz.so. PIL espera que libz.so esté ubicado en /usr/lib no en /usr/lib/i386-linux-gnu/libz.so .

Para solucionar el problema

1) Encuentre la ubicación de sus sistemas libz.so usando find . -name libz.so find . -name libz.so

2) Cree un enlace flexible de libz.so a / usr / lib usando sudo ln -s /usr/lib/i386-linux-gnu/libz.so /usr/lib .

3) Y como @Larry sugirió que tenía que volver a instalar PIL después de un enlace simbólico con el de zlib.

Para resolver este problema para el sistema de 64 bits, visite http://www.foxhop.net/ubuntu-python-easy_install-pil-does-not-install-zlib-support