Ubuntu logo

Developer

Empaquetar módulos y aplicaciones de Python

Nuestro empaquetado sigue la Python policy de Debian. Usaremos el paquete python-markdown como ejemplo, el cual se puede descargar desde PyPI. Puede ver su empaquetado en su Subversion repository.

Existen dos tipos de paquetes de Python: módulos y aplicaciones.

En el momento de escribir esto, Ubuntu tiene dos versiones incompatibles de Python: 2.x y 3.x. /usr/bin/python es un enlace simbólico a la versión Python 2.x predeterminada y /usr/bin/python3, a la versión Python 3.x predeterminada. Los módulos de Python se deberían construir contra todas las versiones de Python soportadas.

Si va a empaquetar un nuevo módulo Python, encontrará la herramienta py2dsc útil (disponible en el paquete python-stdeb).

debian/control

Las versiones Python 2.x y 3.x del paquete deberían estar en paquetes binarios separados. Los nombres deberían tener el formato python{,3}-modulename (como: python3-dbus.mainloop.qt). Aquí usaremos python-markdown y python3-markdown para los paquetes del módulo y python-markdown-doc para el paquete de documentación.

Elementos de debian/control que son específicos para los paquetes Python:

  • La sección de los paquetes de módulos debería ser python y doc para el paquete de documentación. Para una aplicación, un simple paquete binario será suficiente.

  • Deberían añadirse dependencias de compilación a python-all (>= 2.6.6-3~) y python3-all (>= 3.1.2-7~) para asegurarse de que los asistentes de Python están disponibles (véase la siguiente sección para más detalles).

  • Se recomienda añadir los campos X-Python-Version y X-Python3-Version, véase la sección «Specifying Supported Versions» de la política para más información. Por ejemplo:

    X-Python-Version: >= 2.6
    X-Python3-Version: >= 3.1

    Si su paquete funciona sólo con Python 2.x o 3.x, la compilación depende solo de un paquete -all y usa solo un campo -Version.

  • Los paquetes de módulos deberían tener variables de sustitución {python:Depends} y {python3:Depends} (respectivamente) en sus listas de dependencias.

debian/rules

Los asistentes recomendados para módulos python son dh_python2 y dh_python3. Desafortunadamente, debhelper no compila todavía paquetes Python 3.x automáticamente (véase bug 597105 en Debian BTS), así que deberá hacerlo manualmente en las secciones «override» (omita esto si su paquete no soporta Python 3.x).

Aquí tiene nuestro archivo debian/rules (con anotaciones):

# These commands build the list of supported Python 3 versions
# The last version should be just “python3” so that the scripts
# get a correct shebang.
# Use just “PYTHON3 := $(shell py3versions -r)” if your package
# doesn’t contain scripts
PY3REQUESTED := $(shell py3versions -r)
PY3DEFAULT := $(shell py3versions -d)
PYTHON3 := $(filter-out $(PY3DEFAULT),$(PY3REQUESTED)) python3

%:
    # Adding the required helpers
    dh $@ --with python2,python3

override_dh_auto_clean:
    dh_auto_clean
    rm -rf build/

override_dh_auto_build:
    # Build for each Python 3 version
    set -ex; for python in $(PYTHON3); do \
        $$python setup.py build; \
    done
    dh_auto_build

override_dh_auto_install:
    # The same for install; note the --install-layout=deb option
    set -ex; for python in $(PYTHON3); do \
        $$python setup.py install --install-layout=deb --root=debian/tmp; \
    done
    dh_auto_install

También es una buena práctica ejecutar pruebas durante la compilación, si se distribuyen desde aguas arriba. Normalmente las pruebas se pueden invocar usando setup.py test o setup.py check.

debian/*.install

Los módulos de Python ”.x se instalan en el directorio /usr/share/pyshared/ y se crean enlaces simbólicos en /usr/lib/python2.x/dist-packages/ para cada versión del intérprete, mientras que los de Python 3.x se instalan en /usr/lib/python3/dist-packages/.

Si su paquete es una aplicación y tiene módulos de Python privados, debería instalarse en /usr/share/module o en /usr/lib/module si los módulos son dependientes de la arquitectura (por ejemplo, extensiones). Véase la sección de programas que incluyen módulos privados (“Programs Shipping Private Modules”) de la política.

Así que nuestro archivo python-markdown.install se parecerá a esto (también queremos instalar un ejecutable markdown_py):

usr/lib/python2.*/
usr/bin/

y python3-markdown.install tendrá únicamente una línea:

usr/lib/python3/

El paquete -doc

La herramientas más comúnmente usada para compilar documentos Python es Sphinx, Para añadir documentación Sphinx a su paquete (usando el asistente dh_sphinxdoc), debería:

  • Añadir una dependencia de compilación a python-sphinx o a python3-sphinx (dependiendo de la versión de Python que desee usar);
  • Añadir sphinxdoc a la línea dh --with;
  • Ejecutar setup.py build_sphinx en override_dh_auto_build (en ocasiones no es necesario);
  • Añadir {sphinxdoc:Depends} a la lista de dependencias de su paquete -doc;
  • Añadir la ruta del directorio de generación de documentación (normalmente build/sphinx/html) a su archivo .docs.

En nuestro caso, los documentos se compilan automáticamente en el directorio build/docs/ cuando ejecutamos setup.py build, así que podemos simplemente ponerlo en el archivo python-markdown-doc.docs:

build/docs/

Puesto que docs también contiene archivos fuente .txt, también le indicaremos a dh_compress que no los comprima, añadiendo lo siguiente a debian/rules:

override_dh_compress:
    dh_compress -X.txt

Comprobar errores de empaquetado

Junto con lintian, hay una herramienta especial para comprobar paquetes Python, lintian4py. Está disponible en el paquete lintian4python. Por ejemplo, estas dos órdenes invocan a las dos versiones de lintian y comprueban los paquetes fuentes y binarios:

lintian -EI --pedantic *.dsc *.deb
lintian4py -EI --pedantic *.dsc *.deb

Aquí la opción -EI se usa para activar etiquetas experimentales e informativas.

Vea también