# rm-rf.es

Python Imaging Library “IOError: decoder jpeg not available”

Últimamente me ha tocado montar y administrar un par de servidores en los que las aplicaciones corren en Python. Uno de ellos necesitaba la librería de gestión de imagenes PIL de Python (Python Imaging Library), por lo que procedí a instalarla del modo que hacemos cualquier instalación de módulos Python. Descargar e instalar:

tar -xzvf Imaging-1.1.6.tar.gz
cd Imaging-1.1.6
python setup.py install

El fallo fue no ejecutar antes de instalar el módulo los test que te informan si todas las dependencias se cumplen correctamente:

python setup.py build_ext -i
python selftest.py

Entonces, el desarrollador de la aplicación confirmó que algo extraño sucedía. No había problema para gestionar imágenes .gif o .png, pero todo tratamiento de imagenes .jpg terminaban en fallos de imagen corrupta y diversos errores.

Investigando esta fuente, me dispuse a ejecutar los tests que comentaba anteriormente y efectivamente el fallo era que no existía decodificador para jpeg:

IOError: decoder jpeg not available

Procedí a instalarlo desde los repositorios de CentOS:

yum install libjpeg.i386 libjpeg-devel.i386

Tras hacerlo seguía fallando, y era debido a que era necesario reinstalar el módulo de Python PIL para que encontrara las rutas a las librerías correspondientes de libjpeg. Fue necesario eliminar completamente PIL y volverlo a instalar, sino no funciona:

rm -rf /usr/lib/python2.4/site-packages/PIL/
rm -f /usr/lib/python2.4/site-packages/PIL*

A partir de aquí, reinstalé el módulo y podemos observar que los test funcionaron correctamente:

$ python setup.py build_ext -i
$ python selftest.py
57 tests passed.
$ python setup.py install

Python: Cambiar codificación (encoding) por defecto

Python, por defecto trae una codificación en ascii, lo que probablemente os generará problemas y dolores de cabeza a la hora de utilizar caracteres con tilde o especiales como la “ñ”. El típico error es así:

UnicodeEncodeError: ‘ascii’ codec can’t encode character u’\u2014′ in position 14: ordinal not in range(128)

Podéis comprobar la codificación por defecto de python desde la consola python:

>>> import sys
>>> sys.getdefaultencoding()
'ascii'

Para modificar la codificación, simplemente cread un fichero llamado “sitecustomize.py” dentro de la carpeta “site-packages” de python (por ejemplo en mi instalación está en /usr/lib/python2.4/site-packages, y añadir al fichero el siguiente contenido (dependiendo de la codificación que queráis):

import sys
sys.setdefaultencoding('iso-8859-15')