{"id":1583,"date":"2015-02-02T00:21:28","date_gmt":"2015-02-01T23:21:28","guid":{"rendered":"http:\/\/blog.rastersoft.com\/?p=1583"},"modified":"2015-02-02T00:21:28","modified_gmt":"2015-02-01T23:21:28","slug":"generando-paquetes-deb-para-programas-python","status":"publish","type":"post","link":"https:\/\/blog.rastersoft.com\/?p=1583","title":{"rendered":"Generando paquetes DEB para programas en Python"},"content":{"rendered":"<p>Estos \u00faltimos meses he estado aprovechando para reescribir <a href=\"http:\/\/www.rastersoft.com\/programas\/devede_es.html\" target=\"_blank\">Devede<\/a>. El principal motivo de reescribirlo desde cero ha sido, aparte de aprovechar mejor las distintas caracter\u00edsticas de <a href=\"https:\/\/www.python.org\/\" target=\"_blank\">Python 3<\/a> y <a href=\"http:\/\/www.gtk.org\/\" target=\"_blank\">GTK 3<\/a>, para darle una arquitectura interna m\u00e1s moderna, flexible y modular. El resultado es que ahora es much\u00edsimo m\u00e1s f\u00e1cil a\u00f1adir nuevas caracter\u00edsticas, backends y utilidades, y adem\u00e1s puede hacer cosas como convertir en paralelo varios v\u00eddeos, aprovechando al m\u00e1ximo las CPUs multin\u00facleo actuales.<\/p>\n<p>Desde el principio decid\u00ed escribir el c\u00f3digo en condiciones utilizando el m\u00f3dulo <a href=\"https:\/\/docs.python.org\/3\/distutils\/\" target=\"_blank\">DistUtils<\/a> para realizar la instalaci\u00f3n, y result\u00f3 ser un gran acierto porque permite simplificar notablemente la generaci\u00f3n de <a href=\"http:\/\/en.wikipedia.org\/wiki\/Deb_%28file_format%29\" target=\"_blank\">paquetes DEB<\/a>, algo necesario porque varios usuarios que quer\u00edan utilizarlo no se aclaraban con GITHUB ni la l\u00ednea de comandos.<\/p>\n<p>Una vez que ya tenemos listo nuestro script de instalaci\u00f3n <strong>setup.py<\/strong>, siguiendo las directrices de distutils, basta con instalar en nuestro sistema las utilidades <a href=\"https:\/\/pypi.python.org\/pypi\/stdeb\/0.5.1\" target=\"_blank\">stdeb<\/a>. En Debian y Ubuntu el paquete se llama <strong>python3-stdeb<\/strong>; sin embargo, la versi\u00f3n para Python 3 s\u00f3lo est\u00e1 disponible en Ubuntu a partir de Vivid (15.04), que en el momento de escribir esta entrada todav\u00eda est\u00e1 en fase de desarrollo (en Debian est\u00e1 disponible desde Jessie en adelante, por lo que no hay problema). Los que tengan la ultima revisi\u00f3n estable de Ubuntu (14.10 en el momento de escribir esta entrada) s\u00f3lo dispondr\u00e1n de <strong>python-stdeb<\/strong> en sus repositorios, que s\u00f3lo funciona para Python 2 (incluso reescribe el <em><a href=\"http:\/\/es.wikipedia.org\/wiki\/Shebang\" target=\"_blank\">shebang<\/a><\/em> para que apunte a Python 2 en caso de que nuestro c\u00f3digo lo tuviese apuntando a Python 3), por lo que tendr\u00e1n que bajarse a mano el paquete .deb. La opci\u00f3n m\u00e1s directa consiste en buscarlos en <a href=\"http:\/\/packages.ubuntu.com\/search?keywords=stdeb&amp;searchon=names&amp;suite=all&amp;section=all\" target=\"_blank\">Ubuntu Packages<\/a>.<\/p>\n<p>Una vez instalado hay que a\u00f1adir el m\u00f3dulo <strong>dep_util<\/strong> en el script\u00a0<strong>setup.py<\/strong>, para que reconozca las nuevas opciones. Para ello basta con a\u00f1adir al principio:<\/p>\n<div class=\"mycode\">\n<pre class=\"mycode\">from distutils import dep_util<\/pre>\n<\/div>\n<p>Una vez hecho esto hay que a\u00f1adir en el ra\u00edz de nuestro proyecto un fichero llamado <strong>stdeb.cfg<\/strong>. Este fichero contendr\u00e1 todos aquellos datos que el generador no puede extraer de los que se pasan en el script <strong>setup.py<\/strong>, como por ejemplo las dependencias de nuestro programa. El fichero de Devede-NG contiene lo siguiente:<\/p>\n<div class=\"mycode\">\n<pre class=\"mycode\">[DEFAULT]\nDepends = python3, python-support, python-urllib3, python-gi, libgtk-3-0, ffmpeg (&gt;= 7:1.2.6) | libav-tools(&gt;= 6:9.16), mplayer, mpv | vlc, dvdauthor, mkisofs | genisoimage, vcdimager, libvorbis0a, libvorbisfile3<\/pre>\n<\/div>\n<p>El resto de las opciones posibles que se pueden poner se pueden encontrar en la <a href=\"https:\/\/pypi.python.org\/pypi\/stdeb\/0.5.1\" target=\"_blank\">documentaci\u00f3n de stdeb<\/a>. Un detalle importante es que no consegu\u00ed que funcionase con el comando <em>XS-Python-Version<\/em>. Cada vez que lo a\u00f1ad\u00eda para forzar que s\u00f3lo generase paquetes de Python 3, el proceso devolv\u00eda un error.<\/p>\n<p>Ahora ya est\u00e1 todo listo, por lo que para generar el paquete basta con ejecutar el siguiente comando:<\/p>\n<div class=\"mycode\">\n<pre class=\"mycode\">python3 setup.py --command-packages=stdeb.command bdist_deb<\/pre>\n<\/div>\n<p>Y ya est\u00e1; se crear\u00e1 un directorio llamado <em>deb_dist<\/em> en cuyo interior encontraremos un paquete deb con nombre <em>python3-nombreprograma&#8203;_numero&#8203;.de&#8203;.version&#8203;_all.deb<\/em>.<\/p>\n<p>Por \u00faltimo, comentar varios detalles extra:<\/p>\n<ul>\n<li>es fundamental llamarlo con <em>python3<\/em>; de no hacerlo as\u00ed, generar\u00e1 un paquete para Python 2 (incluso reescribir\u00e1 el <em>shebang<\/em> de los ficheros python para que apunten a Python 2)<\/li>\n<li>podemos hacer todos los cambios que queramos en nuestro c\u00f3digo y regenerar el paquete directamente siempre que no cambiemos la cadena con la versi\u00f3n en nuestro script <strong>setup.py<\/strong>. Si la cambiamos debemos borrar el directorio <em>deb_dist<\/em> antes de volver a generar el paquete, o el proceso fallar\u00e1, devolviendo un error.<\/li>\n<li>debe tenerse muy en cuenta que, al generar paquetes .deb, el script <strong>setup.py<\/strong> se ejecuta <strong>dos veces<\/strong>: la primera para copiar al directorio <em>deb_dist<\/em> s\u00f3lo los ficheros que realmente conforman nuestro programa y que se tienen que instalar en el sistema (de manera que otros ficheros, como el README o similares, no se incluir\u00e1n en el paquete), y la segunda vez para configurar y generar el paquete .DEB en s\u00ed. En el caso de Devede-NG esto fue importante tenerlo en cuenta porque lo primero que hace el script de instalaci\u00f3n es compilar los ficheros de traducciones <em>.po<\/em> y copiarlos en una carpeta diferente, que es la que luego se instala en el sistema. Pero al ejecutarse por segunda vez dentro de <em>deb_dist<\/em>, los ficheros <em>.po<\/em> ya no estaban disponibles porque \u00e9stos no se copian en el sistema. Tras hacer unas modificaciones menores fue posible hacer que funcionase perfectamente.<\/li>\n<\/ul>\n","protected":false},"excerpt":{"rendered":"<p>Estos \u00faltimos meses he estado aprovechando para reescribir Devede. El principal motivo de reescribirlo desde cero ha sido, aparte de aprovechar mejor las distintas caracter\u00edsticas de Python 3 y GTK 3, para darle una arquitectura interna m\u00e1s moderna, flexible y modular. El resultado es que ahora es much\u00edsimo m\u00e1s f\u00e1cil a\u00f1adir nuevas caracter\u00edsticas, backends y &hellip; <a href=\"https:\/\/blog.rastersoft.com\/?p=1583\" class=\"more-link\">Seguir leyendo <span class=\"screen-reader-text\">Generando paquetes DEB para programas en Python<\/span> <span class=\"meta-nav\">&rarr;<\/span><\/a><\/p>\n","protected":false},"author":1,"featured_media":0,"comment_status":"open","ping_status":"open","sticky":false,"template":"","format":"standard","meta":{"footnotes":""},"categories":[6,7],"tags":[],"class_list":["post-1583","post","type-post","status-publish","format-standard","hentry","category-trucos","category-tutoriales"],"_links":{"self":[{"href":"https:\/\/blog.rastersoft.com\/index.php?rest_route=\/wp\/v2\/posts\/1583","targetHints":{"allow":["GET"]}}],"collection":[{"href":"https:\/\/blog.rastersoft.com\/index.php?rest_route=\/wp\/v2\/posts"}],"about":[{"href":"https:\/\/blog.rastersoft.com\/index.php?rest_route=\/wp\/v2\/types\/post"}],"author":[{"embeddable":true,"href":"https:\/\/blog.rastersoft.com\/index.php?rest_route=\/wp\/v2\/users\/1"}],"replies":[{"embeddable":true,"href":"https:\/\/blog.rastersoft.com\/index.php?rest_route=%2Fwp%2Fv2%2Fcomments&post=1583"}],"version-history":[{"count":0,"href":"https:\/\/blog.rastersoft.com\/index.php?rest_route=\/wp\/v2\/posts\/1583\/revisions"}],"wp:attachment":[{"href":"https:\/\/blog.rastersoft.com\/index.php?rest_route=%2Fwp%2Fv2%2Fmedia&parent=1583"}],"wp:term":[{"taxonomy":"category","embeddable":true,"href":"https:\/\/blog.rastersoft.com\/index.php?rest_route=%2Fwp%2Fv2%2Fcategories&post=1583"},{"taxonomy":"post_tag","embeddable":true,"href":"https:\/\/blog.rastersoft.com\/index.php?rest_route=%2Fwp%2Fv2%2Ftags&post=1583"}],"curies":[{"name":"wp","href":"https:\/\/api.w.org\/{rel}","templated":true}]}}