Matplotlib no quiere dibujar

Partiendo del hecho de que no tengo experiencia en la configuración de entornos virtuales ni instalación de librerías en python, el siguente post se debe entender con la debida prudencia. 🙂
Partimos de un flamante Linux Mint 15 recién instalado, con python 2.7.3 de serie. Instalas git, instalas pip y como eres previsor (o aprendiz siguiendo tutoriales como yo) instalas virtualenv y virtualenvwrapper.

$ sudo pip install virtualenv

$ sudo pip install virtualenvwrapper
$ export WORKON_HOME=~/Envs
$ mkdir -p $WORKON_HOME
$ source /usr/local/bin/virtualenvwrapper.sh

Se puede hacer un script con las lineas de configurarlo (deberás ejecutarlo con . ./preparevirtualenv.sh, para que lo ejecute en el mismo shell en el que estás y no abra otro). Otra opción es añadirlas a .bashrc)

Una vez instalado y configurado, probamos:

$ mkvirtualenv TestEnv
(TestEnv) $
# deactivate the TestEnv
(TestEnv) $ deactivate
$ 
# reactivate the TestEnv
$ workon TestEnv
(TestEnv) $ 
# install the Django package in your TestEnv environment
(TestEnv) $ pip install django
Downloading/unpacking django
  Downloading Django-1.1.1.tar.gz (5.6Mb): 5.6Mb downloaded
  Running setup.py egg_info for package django
Installing collected packages: django
  Running setup.py install for django
    changing mode of build/scripts-2.6/django-admin.py from 644 to 755
    changing mode of /Users/lynnroot/Envs/TestEnv/bin/django-admin.py to 755
Successfully installed django
(TestEnv) $

Instalación de numpy y matplotlib en un entorno virtual

Estamos ya dentro de un entorno virtual y queremos usar matplotlib. Aquí es donde surgen los problemas. Si lo instalamos con apt-get puede que no tengamos problemas porque gestiona las dependencias, pero no tendremos independencia entre entornos. Sin embargo pip parece no gestionar las dependiencias correctamente. Asi que evitamos el uso de pip para matplotlib y usamos easy_install.

$ pip install numpy
$ pip install scipy
$ easy_install matplotlib

En mi caso tampoco funcionó. Según la documentacion se necesitan numpy >=1.4, libpng >=1.2 y freetype >=1.4, además de python-dev. Podemos usar apt-get para que las busque e instale automáticamente…

$ sudo apt-get build-dep matplotlib
[sudo] password for xurxo: 
Leyendo lista de paquetes... Hecho
Creando árbol de dependencias       
Leyendo la información de estado... Hecho
E: Debe poner algunos URIs fuente («source») en su sources.list

¡Vaya! ¡Otro escollo! El error indica que hay que añadir algun repositorio de fuentes a la lista de repositorios disponibles. Así que…

$ sudo gedit /etc/apt/sources.list

y agregamos una linea con un repositorio (más mirrors de fuentes en http://ftp.se.debian.org/debian/README.mirrors.html):

deb-src http://ftp.es.debian.org/debian/ stable main

Actualizamos la cache:

$ sudo apt-get update

y ya podemos instalar las dependencias y volver a ejecutar easy_install

matplotlib se niega a dibujar

Estamos ya dentro de nuesto entorno virtual y acemos un sencillo programa dentro de un entorno virutal para probar:

import matplotlib.pyplot as p
p.plot(range(20),range(20))
p.show()

Ejecutamos pero no vemos nada. Ni un error. Ni un mensaje. Nada

Inicialmente es posible que se trate de un problema de configuración. El archivo que indica a matplotlib el ‘backend’ a usar es ~/.matplotlib/matplotlibrc (ver Customizing matplotlib para alternativas), y si no muestra nada uno de los motivos puede ser que esté configurado como sigue:

backend : template

Hay que sustituirlo por algo que realmente sea un backend de verdad. Fuera del entorno virtual comprobamos que nos funciona GTK, así qie vamos a intentar usarlo en el entorno virtual.

backend : GtkAgg

Las opciones disponibles son ‘GTK’, ‘GTKAgg’, ‘GTKCairo’, ‘FltkAgg’, ‘MacOSX’, ‘QtAgg’, ‘Qt4Agg’, ‘TkAgg’, ‘WX’, ‘WXAgg’, ‘CocoaAgg’, ‘agg’, ‘cairo’, ‘emf’, ‘gdk’, ‘pdf’, ‘ps’, ‘svg’, ‘template’

Vale, ya hemos configurado el backend, así que volvermos a probar y obtenemos…

import cairo
 ImportError: No module named cairo

La solución la encontré en Stack Overflow. Esencialmente, dentro del entorno virtual python no encuentra las librerías que necesita para el backend. Vamos a ayudarle un poco.

El truco consiste en incluir en el entorno virtual una copia de las librerías necesarias. Cada vez que creamos un nuevo entorno se genera un directorio con una copia de python y todas las librerías que importemos se guardarán también en ese lugar. Si además le añadimos una copia de las librerías necesarias para que funcione GTK habremos conseguido nuestro objetivo.

Copiar las librerías es un poco drástico, así que usamos enlaces simbólicos. Suponiendo que el directorio de entornos virtuales es ~/Envs (como vimos al principio de todo, durante la instalacion de virtualenvwrapper) y que nuestro entorno es test podemos haremos

$ mkdir -p ~/Envs//home/xurxo/Envs/test/lib/python2.7/dist-packages/
$ cd ~/Envs//home/xurxo/Envs/test/lib/python2.7/dist-packages/

$ ln -s /usr/lib/python2.7/dist-packages/glib/ glib
$ ln -s /usr/lib/python2.7/dist-packages/gobject/ gobject
$ ln -s /usr/lib/python2.7/dist-packages/gtk-2.0* gtk-2.0
$ ln -s /usr/lib/python2.7/dist-packages/pygtk.pth pygtk.pth
$ ln -s /usr/lib/python2.7/dist-packages/cairo cairo

Para otros backend pueden requerirse otros enlaces, pero la filosofía debería ser similar.

Desde luego, no es este un buen comienzo para iniciarse en python…

Anuncios
Tagged with: , , ,
Publicado en Programacion

Deixa a túa opinión

Introduce tus datos o haz clic en un icono para iniciar sesión:

Logo de WordPress.com

Estás comentando usando tu cuenta de WordPress.com. Cerrar sesión / Cambiar )

Imagen de Twitter

Estás comentando usando tu cuenta de Twitter. Cerrar sesión / Cambiar )

Foto de Facebook

Estás comentando usando tu cuenta de Facebook. Cerrar sesión / Cambiar )

Google+ photo

Estás comentando usando tu cuenta de Google+. Cerrar sesión / Cambiar )

Conectando a %s

A %d blogueros les gusta esto: