Instalador, setup.py, usando distutils para instalar geco

GECO's picture

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:

  1. # setup.py de gecoc
  2. from distutils.core import setup
  3.  
  4. setup(name = 'gecoc',
  5. version = '1.0',
  6. description = 'geco client lib',
  7. author = 'Daniel Garcia Moreno',
  8. author_email = '<dani@danigm.net>',
  9. url = 'http://bzr.danigm.net/geco',
  10. license = 'GPLv3',
  11. scripts = ['terminal-geco'],
  12. packages = ['gecoc']
  13. )

$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/

  1. # setup.py de gtk-geco
  2. from distutils.core import setup
  3. import os
  4.  
  5. datafiles = []
  6.  
  7. for i in os.listdir('glade'):
  8. datafiles.append(('share/gtk-geco/', ['glade/'+i]))
  9.  
  10. datafiles.append(('share/pixmaps', ['geco.png']))
  11. datafiles.append(('share/applications', ['gtkgeco.desktop']))
  12.  
  13. setup(name = 'gtk-geco',
  14. version = '1.0',
  15. description = 'gtk client for geco',
  16. author = 'Daniel Garcia Moreno',
  17. author_email = '<dani@danigm.net>',
  18. url = 'http://bzr.danigm.net/geco',
  19. license = 'GPLv3',
  20. data_files = datafiles,
  21. scripts = ['gtk-geco'],
  22. py_modules = ['gtkgeco'],
  23. packages = ['gecoc']
  24. )

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:

  1. #!/bin/bash
  2.  
  3. function install_help(){
  4. echo "Ayuda del instalador $(basename $0)"
  5. echo " Con este instalador puedes instalar:"
  6. echo " gecod"
  7. echo " gecoc"
  8. echo " gtk-geco"
  9. echo " web-geco"
  10. echo ""
  11. echo " Usalo pasando como argumento el nombre de lo que quieras instalar"
  12. echo " por ejemplo:"
  13. echo " sudo ./$(basename $0) gecod"
  14. }
  15.  
  16. root=$PWD
  17.  
  18. if [ "$#" -eq 0 ]
  19. then
  20. install_help
  21. exit 0
  22. fi
  23.  
  24. while [ "$#" -gt 0 ]
  25. do
  26. case $1 in
  27. -h | --help)
  28. install_help
  29. shift
  30. ;;
  31. gecod)
  32. cd $root
  33. cd src/gecod/
  34. echo "instalando gecod"
  35. python setup.py install
  36. shift
  37. ;;
  38. gecoc)
  39. cd $root
  40. cd src/gecoc/
  41. echo "instalando gecoc"
  42. python setup.py install
  43. shift
  44. ;;
  45. gtk-geco)
  46. cd $root
  47. cd src/gecoc/gtk-geco
  48. echo "instalando gtk-geco"
  49. python setup.py install
  50. shift
  51. ;;
  52. web-geco)
  53. cd $root
  54. cd src/gecoc/web-geco
  55. echo "instalando web-geco"
  56. python setup.py install
  57. shift
  58. ;;
  59. *)
  60. install_help
  61. shift
  62. ;;
  63. esac
  64. done

Y con este instalador instalar por ejemplo el cliente de escritorio es tan fácil como ejecutar:

$sudo ./install.sh gtk-geco