Instalador, setup.py, usando distutils para instalar geco

Cada vez que hago un desarrollo comienzo creando una carpeta y a partir de esa carpeta raíz del proyecto comienzo a generar todo lo necesario para que se pueda ejecutar. Hasta hace bien poco GECO estaba así y se podían ejecutar cada una de sus partes, tanto el servidor como el cliente de forma simple tan solo entrando en el directorio correspondiente y lanzando el script.
Pero cuando comienzas a utilizar un programa de manera más o menos habitual, no es cómodo el tener que entrar en el directorio correspondiente y lanzar el script, para un uso habitual es más conveniente el tener el programa instalado como uno más del sistema. Y esto es lo último que he realizado, un instalador sencillo que te deja todo donde "debe" estar para facilitar el uso.
Python ofrece una forma sencilla de hacer instaladores de módulos y programas, es el conocido módulo distutils. Normalmente los programas en python cuando te los descargas vienen con un fichero setup.py el cual hay que ejecutar para que se instale en el sistema, es una especie de make, pero para python.
¿Cómo crear un fichero setup.py?
El fichero setup.py no es más que un pequeño script en python en el cual tendremos que definir qué queremos que se instale, autor, descripción y otros datos.
Veamoslo con ejemplos:
# setup.py de gecoc from distutils.core import setup setup(name = 'gecoc', version = '1.0', description = 'geco client lib', author = 'Daniel Garcia Moreno', author_email = '<dani@danigm.net>', url = 'http://bzr.danigm.net/geco', license = 'GPLv3', scripts = ['terminal-geco'], packages = ['gecoc'] )
$sudo python setup.py install
Con este script se puede instalar la librería gecolib que está en el paquete gecoc y el script terminal-geco. La mayoría de las opciones se entienden perfectamente, son datos opcionales que dan información sobre el programa. Las partes importantes en este ejemplo son las opciones scripts y packages. Scripts instala la lista de scripts en /usr/bin y packages instala un paquete python (directorio con __init__.py) en /usr/lib/pythonX.X/site-packages/.
El directorio destino de la instalación se puede cambiar y poner otro en lugar de /usr/, por ejemplo /usr/local/
$sudo python setup.py install --prefix=/usr/local/
# setup.py de gtk-geco from distutils.core import setup import os datafiles = [] for i in os.listdir('glade'): datafiles.append(('share/gtk-geco/', ['glade/'+i])) datafiles.append(('share/pixmaps', ['geco.png'])) datafiles.append(('share/applications', ['gtkgeco.desktop'])) setup(name = 'gtk-geco', version = '1.0', description = 'gtk client for geco', author = 'Daniel Garcia Moreno', author_email = '<dani@danigm.net>', url = 'http://bzr.danigm.net/geco', license = 'GPLv3', data_files = datafiles, scripts = ['gtk-geco'], py_modules = ['gtkgeco'], packages = ['gecoc'] )
Este otro ejemplo es el instaldor de la aplicación de escritorio gtk-geco. En este caso además de instalar un script y el paquete gecoc se instala un módulo python, que es un simple fichero .py y una serie de datos, que se hace con data_files. Con datafiles se puede instalar cualquier tipo de archivo en cualquier ruta del sistema. Si la ruta es relativa se instala a partir de La ruta /usr (o la que se haya especificado), y si la ruta es absoluta se usa esa. La ruta define un directorio y la lista de ficheros siguiente serán los que se copien a dicha ruta.
Facilitando un poco más la instalación
Tengo el código dividido en dos carpetas dentro de src, gecod y gecoc y dentro de gecoc está gtk-geco y web-geco que son dos clientes diferentes. Para facilitar la instalación he creado un script en bash que se encarga de instalar el módulo que deseemos de manera sencilla:
#!/bin/bash function install_help(){ echo "Ayuda del instalador $(basename $0)" echo " Con este instalador puedes instalar:" echo " gecod" echo " gecoc" echo " gtk-geco" echo " web-geco" echo "" echo " Usalo pasando como argumento el nombre de lo que quieras instalar" echo " por ejemplo:" echo " sudo ./$(basename $0) gecod" } root=$PWD if [ "$#" -eq 0 ] then install_help exit 0 fi while [ "$#" -gt 0 ] do case $1 in -h | --help) install_help shift ;; gecod) cd $root cd src/gecod/ echo "instalando gecod" python setup.py install shift ;; gecoc) cd $root cd src/gecoc/ echo "instalando gecoc" python setup.py install shift ;; gtk-geco) cd $root cd src/gecoc/gtk-geco echo "instalando gtk-geco" python setup.py install shift ;; web-geco) cd $root cd src/gecoc/web-geco echo "instalando web-geco" python setup.py install shift ;; *) install_help shift ;; esac done
Y con este instalador instalar por ejemplo el cliente de escritorio es tan fácil como ejecutar:
$sudo ./install.sh gtk-geco



