2012-01-31 12 views
7

Sto usando ReportLab per stampare un grafico prodotto da matplotlib.IOError: "decoder zip non disponibile" usando matplotlib PNG in ReportLab su Linux, funziona su Windows

Sono in grado di farlo sulla mia macchina di sviluppo Windows senza problemi. Quando eseguo il deploy su un server Ubuntu, tuttavia, il rendering fallisce con l'errore descritto. Presumo che mi manca un modulo Python, ma non so quale. Credo che le versioni di Python, matplotlib, ReportLab e PIL siano le stesse sia sulla mia macchina di sviluppo che sul server.

codice per convertire la cifra matplotlib (chiamato grafico) in PNG e restituirlo:

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

return img_stream 

codice per utilizzare l'immagine:

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') 

Quando eseguito su Windows, questo funziona. Quando viene eseguito su Linux produce questo errore:

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=[[email protected]] 
    handle_pageBegin args=() 
+1

Sembra non trovi il modulo zlib. Dai un'occhiata qui http://www.foxhop.net/ubuntu-python-easy_install-pil-does-not-install-zlib-support – RanRag

+0

Hai autocompilato PIL? O è PIL gestito da 'apt'? – sarnold

+0

@sarnold: credo che PIL sia stato installato da ReportLab. In ogni caso, non l'ho creato io l'ho preso come parte di qualcos'altro o con easy_install su Windows e apt-get su Ubuntu. –

risposta

12

Apparentemente PIL setup.py non sa come trovare libz.so. PIL si aspetta che libz.so si trovi in ​​/usr/lib non /usr/lib/i386-linux-gnu/libz.so.

per risolvere il problema

1) Trovare la posizione dei vostri sistemi libz.so utilizzando find . -name libz.so.

2) Creare un collegamento software da libz.so a/usr/lib utilizzando sudo ln -s /usr/lib/i386-linux-gnu/libz.so /usr/lib.

3) E come suggerito da @Larry, è necessario reinstallare PIL dopo aver simulato il link per zlib.

per risolvere questo problema per il sistema a 64-bit di dare un'occhiata qui http://www.foxhop.net/ubuntu-python-easy_install-pil-does-not-install-zlib-support

+0

Ho lo stesso problema ma mi manca libz.so. Esecuzione di linux mint e arch mi dà i686 – ralphtheninja

+1

Questa correzione lo stesso errore con la libreria di cuscini. – Druska

Problemi correlati