Crear un paquete Debian (.deb) de un programa en Python (.py)

Siempre quise aprender a hacer paquetes Debian porque muchas veces les quería pasar mis programas a mis amigos y se quejaban que tenían que instalar muchas dependencias o quizás eso me decían a mí para no correr mis programas en sus máquinas.

También porque evitás todo tipo de explicación de cómo se instala, cuál es el .py que se debe ejecutar, que versión de Python, y muchas otras cosas. Además que queda lindo ya que podemos hacer que lo ponga en el Menú K en KDE o Gnome en su correspondiente panel de aplicaciones indicándole cuál va a ser su ícono y demás.

Hace mucho tiempo me puse a investigar e incluso me leí toda la guía de desarrolladores de Debian la cuál en ese momento no me sirvió, quizás porque no la entendí o porque no estaba directamente relacionada con Python (y yo recién empezaba con ambos).

El 9 de Junio de éste año se llevó a cabo la 2da Jornada de Python en Santa Fé en la que vino gente de otros lados del país y tuve la posibilidad de alojar a dos chicos en mi casa; Héctor Sánchez y Hugo Ruscitti de Buenos Aires, a los cuales aproveché para preguntarle de todo tipo de cosas😀 sobre en lo que yo estaba fresquito y ellos ya tenían un poco más de experiencia.

Cómo Hugo se dedicaba a hacer juegos para una distribución de Debian y había cosas que hacía en Python le pregunté cómo hacer un paquete de uno de mis juegos (Tweety Finger) y me ayudó a crearlo en ese momento, explicándome que era lo básico para hacerlo y siguiendo de ejemplo un paquete existente. Existen muchas opciones para crear un paquete Debian, como por ejemplo los nombres genéricos en los distintos idiomas, los cuales son tediosas de indicar e incluso ni los sabemos; y a mí me interesaba que sean de fácil instalación mis programas.

Lo más recomendable es leer la guía expuesta arriba o buscar información en Google de la estructura de los paquetes de Debian, para saber y comprender cuáles son las opciones mínimas para que cumpla los estándares de Debian y poder ser redistribuido e incluso incluído en alguna de las distribuciones de Debian y sus derivadas.

Lo primero que hice fué abrir una terminal y entrar al programa mc y buscar en la carpeta /var/cache/apt/archives algún paquete que halla descargado anteriormente para basarme en su estructura y ver cómo estaban configurado los distintos archivos. Hoy tenía que hacer otro paquete y siempre me olvido cómo se hacen, asique agarré de ejemplo el Kate.

Lo más importante a tener en cuenta es la estructura de directorios del paquete y el archivo DEBIAN/control. Éste es un archivo de texto que se utilizar para indicar las dependecias del paquete, una descripción corta, una larga, el nombre, la versión, etc.

Explico la estructura del paquete que vamos a crear con un ejemplo, el del paquete que acabo de crear recién para el juego Twisted Zombie.

DEBIAN/
    control
usr/
    share/
        applications/
            twisted-zombie.desktop
        pixmaps/
            twisted-zombie-icon.png
        twisted-zombie/
            data/
            lib/
            COPYING
            README.txt
            create-upload.py
            pyweek-upload.py
            run_game.py

El archivo DEBIAN/control es que el expliqué anteriormente. La estructura /usr/share/[…] indica dónde se va a copiar el contenido de ésta; por ejemplo el archivo run_game.py quedará instalado en nuestro sistema con en la ruta /usr/share/twisted-zombie/run_game.py.

El otro archivo importante es /usr/share/applications/twisted-zombie.desktop ya que en este indicamos en dónde se va a ubicar en el Menú K, que órden debe ejecutarse cuando se llame, qué ícono tendrá, etc. Se pueden ver los archivos de este ejemplo en los links de cada uno de estos (arriba).

En los archivos fuente (.py) que carguemos archivos externos, como ser imágenes, sonidos etc; debemos hacer un change dir a la nueva ubicación de nuestro programa (en este caso /usr/share/twisted-zombie) agregando la línea:

os.chdir(“/usr/share/twisted-zombie”)

Para que al ser llamado desde cualquier otra ruta el programa siempre se posicione dónde él sabe que tiene los archivos a cargar.

Una vez creada la estructura anteriormente mostrar y configurado los archivos mencionados a gusto, se puede ejecutar este comando para crear el paquete:

$ dpkg –build twisted-zombie/ twisted-zombie-1.0_all.deb

Si la estructura de la carpeta twisted-zombie/ está mal formada, el comando nos informa de esto, incluso también si al archivo control no le dejamos un espacio en blanco en la última línea, y demás.

El nombre que se le da es de la forma <nombre-paquete>-<version>_<arquitectura>.deb.Luego para probar que esto funciona correctamente lo instalamos:

$ dpkg -i twisted-zombie-1.0_all.deb

Si algo salió mal, por ejemplo, al hacer click en el Menu K no aparece nuestro programa basta con buscar el error en el archivo twisted-zombie.desktop, desintalar el programar, crear el paquete e instalarlo nuevamente. Para desintalarlo lo hacemos cómo si fuera cualquier otro paquete:

$ sudo apt-get remove twisted-zombie

Espero que sirva esto y no haberme olvidado ningún paso del proceso, parece complicado, pero es algo simple; como todo, al principio es complicado o por lo menos parece. Pero al poder ver cómo están construidos los demás es fácil guiarse. Incluso se puede usar un paquete más chico de ejemplo que el Kate.

Cualquier cosa que no se entienda o no quede bien en claro comenten y depaso me hacen seguir estudiando😉

11 pensamientos en “Crear un paquete Debian (.deb) de un programa en Python (.py)

  1. Calabaza dice:

    La mejor forma de probar los paquetes, antes de instalarlos es chequeandolos con una aplicación llamada lintian. Esta verifica si el paquete cumple con los estándares de Debian.

    apt-get install lintian #para instalarlo

    lintian nombre_del_paquete.deb #para realizar la comprobación

    Interesante el artículo, lo de los .desktop y pixmaps no lo sabía.

    La Debian Policy es algo densa, pero es la referencia definitiva por si se quiere refinar la técnica y crear paquetes que cumplan con todos los requerimientos para poder ser incluidos en un repositorio oficial.
    http://www.debian.org/doc/debian-policy/

  2. Juanjo dice:

    Dónde especificás con que comando se ejecutar el juego?

  3. humitos dice:

    Juanjo, fijate en el archivo “.desktop” la opción Exec.
    “Exec=python /usr/share/twisted-zombie/run_game.py”
    Saludos

  4. Karucha dice:

    Muy bueno Humitos! documentaste todo que bien!..

    Me parece que le pifiaste en el link de mi nombre, es un copy del anterior..

  5. humitos dice:

    Karucha, si estaba en cualquiera el link. Este editor de post me está volviendo un poquito loco, pero bueno es lo que hay por ahora. Ya lo arreglo.

    Mirá que groso, a esto lo lee alguien! Wow!

  6. Calabaza dice:

    Gracias al navegador de etiquetas de wordpress …

  7. Juanjo dice:

    Wow, lintian me tiró unos 200 warnings y algún error! Vamos a tener que trabajarlo para meterlo en Debian😉

  8. humitos dice:

    Como dice Calabaza, para que cumpla con todos los estándares de Debian, hay que leerse la Debian Policy Manual y hacerla cumplir para el paquete que uno genera; de este modo podrá entrar en los repositorios oficiales. Asique a seguir estudiando…

  9. gmolleda dice:

    Hola:
    Por una parte esta muy bien, en la orden de –build, sería bueno resaltar que antes de build hay dos guiones, porque en mi ordenador al menos no se ve bien y al principio ponía uno, o bien poner -b en vez de –build.

    Y ahora una pregunta, ¿hay que especificar en algún sitio si el programa también usa un directorio oculto en el /home del usuario? (en ~/.nombreprograma)

    Lo digo para que al desinstalar el programa, el propio sistema borre ese directorio de configuración y no dejar así basurilla por el ordenador (y encima oculta).

    Saludos.

  10. gartuz dice:

    Hola lo intente y me la pelé.

    Resulta que quería hacer lo mismo con un .jar pero algo hice mal luego trate de desinstlarlo con dpkg y me sale error.

  11. […] tengo la máquina, me hice unos mates y me puse a tipear. Basándome en lo que escribí en mi post sobre esto, intentando traducirlo y guiándome para no olvidarme nada. El resultado de ésto y […]

Responder

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: