Ejecutables Python

Se pueden empaquetar los scripts Python para formar ejecutables, a veces independientes, que funcionen bajo un sistema operativo concreto. Para eso se usan paquetes que recopilan las dependencias del código, buscando los paquetes y ejecutables nativos correspondientes para proveernos del ejecutable. Hay otros paquetes que compilan el script para obtener código nativo.

Algunos de estos paquetes pueden funcionar en Windows, Linux o Mac.

Para utilizarlos, lo recomendado es crear un entorno virtual con la versión de Python adecuada e instalar en ella los módulos de los que depende la aplicación. Posteriormente se pueden instalar y hacer uso de algunos de los paquetes o aplicaciones que se enumeran a continuación.

Hay que tener en cuenta que algunos de estos paquetes solo funcionan con determinadas versiones de Python e incluso con ciertos paquetes de Python, por lo que podría ser posible que alguna de ellas no funcionase con la última versión de Python o con algún paquete que use la aplicación. Es conveniente leer la documentación antes de seleccionar el adecuado.

Pyinstaller

Pyinstaller funciona en Windows, Mac y Linux y convierte la aplicación Python y sus dependencias en un ejecutable. Lo que hace Pyinstaller es leer y analizar el script, buscando todas las dependencias del mismo y empaquetandolas junto al script en una carpeta llamada dist. Soporta Python 2.7 y 3.5 o superior, además de algunas de los paquetes mas conocidos como PyQT, Django, wxPython, etc.

Pyinstaller no genera un ejecutable para cada sistema operativo, sino que genera el ejecutable para el sistema operativo donde esté instalado.

Para instalar Pyinstaller se debe ejecutar el siguiente comando:

pip install pyinstaller

La ayuda sobre el paquete se encuentra en la página web del proyecto: https://www.pyinstaller.org o ejecutando el comando:

pyinstaller -h

Se usa el parámetro -F o –onefile para que la aplicación y dependencias se empaqueten en un solo fichero ejecutable, además si la aplicación se ejecutará en un entorno gráfico y no en consola, habría que añadir el parámetro -w, –windowed o –noconsole.

La primera vez que se ejecuta pyinstaller, se genera un fichero con el nombre de la aplicación y extensión .spec, este fichero se puede editar para proporcionarle mas información sobre la ruta a módulos concretos que empaquetará junto al programa.

Ejemplo:

Suponiendo que el script se llame holamundo.py y el código funcione en la consola o terminal, se puede crear un fichero ejecutable con el siguiente comando:

pyinstaller --onefile holamundo.py

Si el script funcionara en una ventana gráfica, porque hiciera uso de tkinter, PyQT o wxPython, el comando sería algo parecido al siguiente:

pyinstaller -onefile -w holamundo.py

Py2APP

Py2App se utiliza en sistemas operativos MacOS ya que es uno con el que se obtiene mejores resultados. Se puede obtener información en su web: https://py2app.readthedocs.io.

Para utilizarlo, el primer paso es generar un fichero llamado setup.py donde se tendrán que incluir los parámetros que configurarán el programa, como son los iconos, gráficos u otras opciones que usa el script. Gracias a esta información el paquete ejecutable contendrá todos los recursos proporcionados y el resultado será una aplicación MacOS lista para usar.

Se instala escribiendo el siguiente comando:

pip install py2app

Para crear el fichero setup.py se ejecuta el siguiente comando:

py2applet --make-setup nombre_app.py

El fichero setup.py generado es algo parecido a este:

"""
This is a setup.py script generated by py2applet
Usage:
    python setup.py py2app
"""
from setuptools import setup
APP = [temporizador.py']
DATA_FILES = []
OPTIONS = {}
setup(
    app=APP,
    data_files=DATA_FILES,
    options={'py2app': OPTIONS},
    setup_requires=['py2app'],
)

Tras modificarlo para añadir el icono de la aplicación, imágenes, etc., quedaría algo parecido a esto:

""
This is a setup.py script generated by py2applet
Usage:
    python setup.py py2app
"""
from setuptools import setup
APP = ['temporizador.py']
DATA_FILES = ['temporizador.icns','arrow_up_green.png','arrow_down_green.png','clock_run.png','document_plain.png','clock_pause.png','folder_out.png','clock_stop.png','disk_blue.png','clock_refresh.png']
OPTIONS = {
    'argv_emulation': False,
    'iconfile': 'temporizador.icns'
    }
setup(
    app=APP,
    data_files=DATA_FILES,
    options={'py2app': OPTIONS},
    setup_requires=['py2app'],
)

Para generar la aplicación se usa el siguiente comando:

python setup.py py2app

Py2app crea dos carpetas, una llamada build donde copia todos los archivos necesarios para empaquetar la aplicación y otra llamada dist donde copia la aplicación. Una vez finalizada la generación del ejecutable, se puede probar su ejecución escribiendo:

open nombre_app.app

Nuitka

Tal como indican en su web https://nuitka.net/, Nuitka es un compilador Python hecho en Python. Actualmente es compatible con las versiones 2.6, 2.7 y 3.3-3.8. Lo que hace Nuitka es compilar el script Python en código nativo, mas rápido en ejecución que el original, para ello convierte los módulos Python en C y los compila también, es por eso por lo que necesita que el compilador gcc o g++ esté instalado en el sistema operativo. En Windows se puede instalar MinGW64 que se puede descargar de la siguiente página: https://mingw-w64.org/doku.php/download.

Para instalar Nuitka hay que ejecutar el siguiente comando:

pip install nuitka

Si se quiere usar Nuitka para genera un ejecutable dependiente del Python del sistema, se ejecuta el siguiente comando:

nuitka3 nombre_app.py

En caso de querer un ejecutable que contenga todas las dependencias a los paquetes.

nuitka3 --follow-imports nombre_app.py

Para obtener un ejecutable capaz de ejecutarse en otros ordenadores habrá que ejecutar el siguiente comando:

nuitka3 --standalone programa.py

Tras la finalización de la compilación hay que copiar al otro dispositivo tanto el ejecutable programa.exe o programa.bin, dependiendo de la plataforma, como la carpeta programa.dist, para asegurar que funcionará.

Deja una respuesta

Tu dirección de correo electrónico no será publicada. Los campos obligatorios están marcados con *