El índice de paquetes de Python, o Cheese Shop como coloquialmente se le conoce, es el repositorio central donde la comunidad de programadores de Python pueden intercambiar sus módulos.
El repositorio está repleto de huevos de Python (Python eggs), que en realidad son módulos de Python empaquetados con diversa información como los módulos de los que depende, la documentación relativa al software o la versión de la que se trata.
El enfoque es muy similar al aplicado por dpkg en Debian o el CPAN en Perl.
He estado leyendo unos cuantos sitios donde se describe en profundidad la técnica y me he animado a hacer mi pequeña aportación a la tienda de quesos.
Para construir un huevo de Python, utilizamos el módulo “setuptools”, que extiende la funcionalidad del veterano “distutils”, utilizado tradicionalmente para la distribución de paquetes Python.
Antes de convertir nuestro código fuente Python en un huevo hay que preparar convenientemente el fichero “setup.py” con el que distribuiremos nuestro paquete. Básicamente, se trata de invocar a la función “setup()” de “setuptools” en lugar de a la de “distutils”. Debemos poner especial atención en los parámetros que escribimos, pues configuran la forma en compartimos nuestro código.
import ez_setupez_setup.use_setuptools() from setuptools import setup, find_packages VERSION='0.2' DESCRIPTION='Wrapper for www.nestoria.co.uk API' LONG_DESCRIPTION='This module implements functions for harvesting data from www.nestoria.co.uk through the public API' CLASSIFIERS = filter(None, map(str.strip,"""Intended Audience :: DevelopersProgramming Language :: PythonTopic :: Internet :: WWW/HTTP""".splitlines())) setup( name="nestoria", version=VERSION, description=DESCRIPTION, long_description=LONG_DESCRIPTION, license="GPL", classifiers=CLASSIFIERS, author="Nando Quintana", author_email="fquintana@codesyntax.com", url="http://www.nestoria.co.uk/help/api-tech", packages =['nestoria'], entry_points="""[nestoria.plugins] nestoria = nestoria.nestoria:Nestoria """, scripts = ['ez_setup.py'], platforms=['any'], install_requires="simplejson")
Entre estos parámetros, podemos destacar los siguientes:
-packages: con él indicaremos la lista de paquetes que distribuiremos en este huevo. En general, será una lista de directorios del código fuente del huevo,
-entry_points: habrá que poner especial atención a este parámetro. Mediante él indicaremos qué modulos podrá importar un programador de nuestro paquete,
-scripts: listado de scripts que irán adjuntos al paquete. Notese que el script “ez_setup.py” es utilizado en nuestro “setup.py” por lo que es interesante asegurarnos de que quien instala nuestro huevo, cuenta con este módulo,
-install_requires: con él se indican los módulos (incluso las versiones de ellos) de los que depende nuestro huevo.
El ejemplo que he preparado es un wrapper del API pública de el sitio web www.nestoria.co.uk. Como podemos ver en el código del huevo, tenemos un directorio llamado “nestoria” donde aparecen los ficheros “__init__.py” y “nestoria.py”. Este último contiene la lógica de negocio y en contreto la clase “Nestoria” que implementa las llamadas al API.
-- nestoria ------ __init__.py ------ nestoria.py -- setup.py -- ez_setup.py
Para construir el huevo bastará con ejecutar el script “setup.py” con los parámetros adecuados:
# /usr/local/bin/python2.4 setup.py sdist bdist_egg
Si todo ha ido bien, tendremos un nuevo directorio llamado “dist”, con los ficheros “nestoria-0.2.tar.gz” y “nestoria-0.2-py2.4.egg”. El primero contiene el código fuente empaquetado al estilo “distutils” aunque mejorado y ha sido generado gracias al parámetro “sdist”. El segundo, contiene el huevo python.
-- build -- dist ----- nestoria-0.2.tar.gz ----- nestoria-0.2-py2.4.egg -- nestoria -- nestoria.egg-info -- ez_setup.py -- setup.py
Ya tenemos nuestro huevo recién hecho y estamos preparados para subirlo a la tienda de quesos. Recuerda que debes estar suscrito para subir paquetes al repositorio. Entre otros datos tendrás que dar el ID de tu clave gpg pública. Si no tienes una, createla, subela a un servidor público de claves e introduce los 8 dígitos del ID.
Si quieres saber cómo se utiliza este huevo, puedes hechar un vistazo a la página del Índice de Paquetes de Python…