domingo, 12 de julio de 2015

Distribución de módulos en Python

La idea de este POST es describir brevemente como podemos hacer para distribuír nuestros módulos desarrollados en Python, para que otros desarrolladores los instalen en sus sistemas y puedan utilizar nuestro código.

1) Creamos el módulo que queremos distribuír

Para este ejempo creamos una funcion llamada "recurPrint", que sirve para recorrer una lista de forma recurisva imprimiendo todos los items que la componen, y en caso que dentro de esta lista exista otra lista, también la recorre e imprime su contenido. 

para ello creamos un directorio llamado recurprint y dentro de este un archivo llamado recurprint.py con el siguiente código:

-----------------------------------------
"""
Prueba de distribucion de modulo
"""

def recurPrint(pList):
    """
    Recorre una lista de forma recursiva e imprime su contendio 
    """
    for item in pList:
        if isinstance(item, list):
            recurPrint(item)
        else:
            print item
------------------ EOF ------------------

2) Generamos el instalador para nuestro módulo

Dentro del mismo directorio, creamos un archivo llamado setup.py, con el siguiente contenido:

-----------------------------------------
from distutils.core import setup

setup(
    name = "recurprint",
    version = "0.0.1",
    py_modules = ["recurprint"],
    author = "Gustavo Borgoni",
    author_email = "gborgoni@gmail.com",
    url = "http://asteriskhelp.blogspot.com",
    description = "Este es un modulo de prueba ",
)
------------------ EOF ------------------

3) Generamos los archivos de distribución

Para ello corremos el siguiente comando, dentro del directorio recurprint:

$ python setup.py sdist

Lo que aparecerá en la pantalla:

-----------------------------------------
running sdist
running check
warning: sdist: manifest template 'MANIFEST.in' does not exist (using default file list)

warning: sdist: standard file not found: should have one of README, README.txt

writing manifest file 'MANIFEST'
creating recurprint-0.0.1
making hard links in recurprint-0.0.1...
hard linking recurprint.py -> recurprint-0.0.1
hard linking setup.py -> recurprint-0.0.1
creating dist
Creating tar archive
removing 'recurprint-0.0.1' (and everything under it)
-----------------------------------------

Una vez finalizada la ejecución del comando anterior, nos vamos a encontrar que el contenido de nuestro directorio quedó de la siguiente manera:

recurprint.py  (Nuestro código)
recurprint.pyc (Nuestro código compilado)
build
    lib
        recurprint.py (Nuestro código)
dist
    recurprint-0.0.1.tar.gz (Nuestro paquete para distribuír con nuestros amigos)
MANIFEST (Contiene la lista de archivos que son incluidas en esta distribución)
setup.py (Archivo setup creado por nosotros)

4) Instalamos nuestro módulo, para luego poder utilizarlo en nuestros proyectos

$ sudo python setup.py install
[sudo] password for gus: 
running install
running build
running build_py
running install_lib
copying build/lib.linux-x86_64-2.7/recuprint.py -> /usr/local/lib/python2.7/dist-packages
byte-compiling /usr/local/lib/python2.7/dist-packages/recurprint.py to recurprint.pyc
running install_egg_info
Writing /usr/local/lib/python2.7/dist-packages/recurprint-0.0.1.egg-info

5) Probamos usar nuestra lib:

$ python
Python 2.7.6 (default, Mar 22 2014, 22:59:56) 
[GCC 4.8.2] on linux2

Type "help", "copyright", "credits" or "license" for more information.
>>> from recurprint import recurPrint
>>> lista = ["item1", "item2", ["subitem1", "subitem2"]]
>>> recurPrint(lista)
item1
item2
subitem1
subitem2
>>>

Esto es todo por ahora, espero que sea útil la info.


Abrazo!