zipapp – Distribuir aplicaciones en formato ZIP



Versión: 3.5+.

A partir de la versión 3.5, el lenguaje suma a su colección estándar el módulo zipapp para distribuir aplicaciones de Python en formato ZIP. El intérprete de CPython ha sido capaz de ejecutar archivos ZIP desde la versión 2.6, por lo que la inclusión de zipapp en la serie 3.5 forma parte de una suerte de reivindicación y publicitación de esta funcionalidad (sumamente útil y práctica, por cierto).

Para hacer un repaso, una aplicación ZIP de Python no es más que cualquier aplicación escrita en el lenguaje pero comprimida en tal formato, a fin de obtener mayor facilidad al momento de su distribución. Utiliza las extensiones .pyz y .pyzw (análogas a las convencionales .py y .pyw) y es ejecutada de la forma tradicional:

python myapp.pyz

En Microsoft Windows, el instalador registra las extensiones y las asocia con el lanzador de Python.

El intérprete se encarga de descomprimir el archivo vía el módulo estándar zipfile y ejecutar el punto de entrada de la aplicación (una función dentro del archivo .py principal), que veremos a continuación.

Además de la documentación del módulo, el documento PEP 0441 — Improving Python ZIP Application Support incluye los detalles de esta nueva implementación como también ejemplos y otra información interesante. Para quienes estén interesados únicamente en cómo utilizar la herramienta o simplemente no quieran entrar en los detalles, veamos cómo crear una aplicación ZIP de Python.

Generalmente querrán ejecutar el módulo directamente desde la terminal como un script para generar archivos .pyz, aunque también provee una sencilla API (en la cual está basado el script) a la que pueden acceder si desean realizar la tarea «manualmente». Suponiendo que tenemos la siguiente aplicación llamada «myapp».

myapp
  |
  | -- config.py
  | -- myapp.py

Si el archivo principal es myapp/myapp.py, entonces llamamos a zipapp de la siguiente forma.

python -m zipapp myapp -m "myapp:main"

Siendo la estructura de los argumentos:

python -m zipapp directorio -m "archivo_principal:funcion"

O bien tilizando la API que provee el módulo:

import zipapp
zipapp.create_archive("myapp", "myapp.pyz", main="myapp:main")

Se habrá generado el archivo myapp.pyz que puede ser ejecutado vía python myapp.pyz. El intérprete de CPython lo descomprime y ejecuta el archivo __main__.py (la opción -m lo habrá creado automáticamente) que llamará a la función main dentro de myapp.py.

El contenido de los siguientes archivos puede ser utilizado para nuestra aplicación de prueba.

myapp/myapp.py

#!/usr/bin/env python
# -*- coding: utf-8 -*-

from config import APPLICATION_NAME


def main():
    print("Hello from {}".format(APPLICATION_NAME))


if __name__ == "__main__":
    main()

myapp/config.py

#!/usr/bin/env python
# -*- coding: utf-8 -*-

__all__ = ["APPLICATION_NAME"]


APPLICATION_NAME = "Recursos Python ZIP Application"

Si se omite el nombre del archivo y función principal (la opción -m), entonces zipapp espera que le hayamos provisto nuestro propio __main__.py. En este caso, podría utilizarse (en reemplazo a myapp.py):

myapp/__main__.py

#!/usr/bin/env python
# -*- coding: utf-8 -*-

from config import APPLICATION_NAME


def main():
    print("Hello from {}".format(APPLICATION_NAME))


main()

El comando para generar la aplicación sería simplemente:

python -m zipapp myapp

La opción -p especifica el intérprete de Python que debe ser utilizado, por ejemplo:

python -m zipapp myapp -p "/usr/bin/env python"

De esta forma #!/usr/bin/env python será añadido al comienzo del archivo ZIP resultante con la misma funcionalidad que en cualquier otro archivo de código de fuente. Esta primera línea es interpretada por el sistema operativo en Unix y por el lanzador de Python en Microsoft Windows para ejecutar la aplicación correctamente.

A grandes rasgos ya tienes todo el conocimiento necesario para distribuir tu propia aplicación ZIP de Python. Puedes conocer más detalles en la documentación oficial del módulo.



Deja una respuesta