Generar archivo ejecutable con cx_Freeze, PyInstaller y py2exe

Generar archivo ejecutable con cx_Freeze, PyInstaller y py2exe

Actualizado el 09/10/2022.

Python es un lenguaje interpretado. Eso implica que los usuarios de nuestras aplicaciones de consola o de escritorio (por ejemplo, aquellas desarrolladas con Tk (tkinter), PyQt/PySide, wxPython, etc.) deben tener Python instalado para correr los archivos .py. Sin embargo, existen múltiples herramientas que permiten crear archivos ejecutables (.exe, .app, etc.) para sistemas Windows, Linux y Mac, de modo que nuestra aplicación pueda ejecutarse sin requerir la instalación de Python. Esto facilita mucho la distribución de nuestros programas y mejora la experiencia del usuario.

Para que puedas empezar rápido, en este artículo haremos una breve presentación de las tres herramientas principales para ello y cómo utilizarlas: PyInstaller, cx_Freeze y py2exe (esta última solo para Windows). Si no sabes con cuál empezar, simplemente usa PyInstaller.

PyInstaller

PyInstaller puede generar ejecutables para Windows, Linux y Mac con un sencillo comando. Primero, asegurémonos de instalar PyInstaller vía pip:

pip install pyinstaller

Luego, invocamos el siguiente comando desde la terminal para convertir el archivo main.py a un ejecutable:

pyinstaller main.py

Si nuestra aplicación está compuesta por múltiples archivos .py, pasaremos el archivo principal, es decir, el archivo donde reside el código para iniciar el programa.

Al finalizar la ejecución del comando, el archivo ejecutable se encontrará en la carpeta dist junto con todas sus dependencias. El formato y la extensión del archivo ejecutable generado dependerán del sistema operativo desde el cual se haya ejecutado el comando. En Windows obtendremos un archivo .exe, en Mac un archivo .app, y en Linux simplemente un archivo ejecutable sin extensión. La carpeta build creada durante la ejecución de PyInstaller puede ser eliminada.

Si queremos que PyInstaller genere un solo ejecutable sin dependencias (archivos .dll, .so, etc.), le pasamos la opción --onefile:

pyinstaller --onefile main.py

Los ejecutables generados con --onefile son más fáciles de distribuir, pero tienen un tiempo mayor de inicialización porque todas las dependencias deben extraerse en una carpeta temporal antes de ejecutar el programa.

Para aplicaciones con interfaces gráficas, será mejor decirle a PyInstaller que no muestre la consola vía la opción --noconsole (todas las opciones son combinables):

pyinstaller --noconsole main.py

Por defecto los ejecutables generados tienen el ícono de PyInstaller. Para especificar nuestro propio ícono, usamos la opción --icon seguida de la ruta o el nombre del archivo de ícono:

pyinstaller --icon=archivo.ico main.py

Puede reducirse el tamaño del archivo final comprimiéndolo con UPX vía la opción --upx-dir, que debe especificar la carpeta en donde se encuentra instalado compresor, por ejemplo:

pyinstaller --onefile --upx-dir=C:\upx main.py

Por último, PyInstaller puede encriptar los archivos de código de fuente de Python siempre que se provea una clave de 16 dígitos vía --key=clave_de_16_digitos:

pyinstaller --key=1234567891234567 main.py

Esta opción requiere del paquete tinyaes, instalable vía:

pip install tinyaes

cx_Freeze

cx_Freeze es muy similar a PyInstaller, e igualmente puede generar ejecutables para Windows, Linux y Mac. Para instalarlo, ejecutamos vía pip:

pip install cx_Freeze

Una vez instalado, si el archivo principal de nuestra aplicación es main.py, abramos una terminal donde se encuentre ubicado y ejecutemos:

cxfreeze -c main.py --target-dir dist

La opción -c indica el nombre del archivo a convertir y --target-dir la carpeta donde se cx_Freeze almacenará el archivo ejecutable.

Para establecer una imagen como ícono, debe utilizarse la opción --icon.

cxfreeze -c main.py --icon=archivo.ico --target-dir dist

En Windows, puede ocultarse la consola implementando la opción --base-name=Win32GUI (todas las opciones son combinables).

cxfreeze -c ain.py --base-name=Win32GUI --target-dir dist

py2exe

py2exe, como indica su nombre, puede generar archivos ejecutables para Windows. Es una extensión de distutils. Podemos instalar py2exe vía pip:

pip install py2exe

Para generar un archivo ejecutable, primero se debe crear un archivo llamado setup.py, indicando el nombre del archivo principal.

from distutils.core import setup
import py2exe

setup(console=["main.py"])

Luego, se invoca este archivo pasándole la opción py2exe:

python setup.py py2exe

Al igual que PyInstaller, el archivo ejecutable se encontrará en la carpeta dist junto con sus dependencias, mientras que build puede ser descartada.

Para aplicaciones de escritorio, utilícese el argumento windows en lugar de console, para evitar que se muestre la consola:

from distutils.core import setup
import py2exe

setup(windows=["main.py"])

Para indicar una imagen como ícono, debe utilizarse la opción icon_resources.

from distutils.core import setup
import py2exe

setup(
    console=[{
        "script": "main.py",
        "icon_resources": [(1, "archivo.ico")]
    }]
)

Pueden incluirse todas las dependencias en un único archivo, similar a la opción --onefile de PyInstaller, usando:

from distutils.core import setup
import py2exe

setup(
    options={"py2exe": {"bundle_files": 1}},
    console=[{
        "script": "main.py"
    }]
)

Donar ❤️

¿Te gusta nuestro contenido? ¡Ayudanos a seguir creciendo con una donación!

19 comentarios.

  1. Baltazar Díaz says:

    Para que a mí me funcionara Pyinstaller, tuve que desactivar el antivirus de windows defender y todo tipo de protección que éste tenía. Tengo Windows 11. Después fue la perfección.

    • Recursos Python says:

      Hola, ¿tuviste problemas con ejecutables creados con la opción --onefile o simplemente con cualquier ejecutable generado por PyInstaller?

  2. Alejandro Gutiérrez says:

    Hola a todos, les comparto mi experiencia, tras intentar con pyInstaller, efectivamente pude crear un ejecutable, sin problemas, el programa corre bien y funciona perfectamente, sin embargo, pienso que efectivamente en algunos casos, cuando se trata de programas desarrollados en python que utilizan muchas librerías, eso podría generar que el ejecutable no funcione bien, en mi caso, desarrollé un programa de 63 megas y al menos con eso, no hubo inconvenientes. Saludos

  3. Hola no he podido, con estos, para generar archivos ejecutables,, he intentado todo, pero siempre me generan error. si alguien ha hecho un ejecutable con un código Python de mas de 2 mil líneas, le agradezco, su ayuda.

    • Recursos Python says:

      Hola. Un código de dos mil líneas no es muy grande, debés tener algún otro problema. Podés crear un tema en el foro para que lo veamos.

      Saludos

    • Yo realice un ejecutable con 41 mil lineas, dure casi un año tratando de realizarle el ejecutable y siempre me daba error.. ya pensaba que eso de pyinstaller era para códigos pequeños, y por ultimo hace una semana, se me dio por copiar en el mismo directorio Dist la base de datos y los archivos de icono y demás,, y me corrió, el ejecutable,, ahora tengo un problema, no se montaron las bibliotecas,, si alguien sabe algo al respecto..le agradezco la información..

      • Recursos Python says:

        Hola. Si te referís a los archivos .dll, tenés que copiar aquellos que requiera tu aplicación en la carpeta de tu ejecutable.

        Saludos

  4. Estoy tratando de aplicar pyintaller py2exe y otros a un codigo python que diseñe, y parece que estas aplicaciones solo funcionan con códigos pequeños, si alguien tiene mucha experiencia en esto, me gustaría compartirle el código para ver si se le puede hacer un ejecutable, con cualquier aplicación,

  5. En mi archivo py uso reportlab y tengo la versión 2.7.10 de python.

    from reportlab.pdfgen import canvas
    from reportlab.lib.colors import white,red,green,blue,gray,black
    from os import startfile

    cuando intento compilar me da error y directamente no crea el archivo .exe.

    Como puedo solucionarlo?

    • Recursos Python says:

      Hola Lucho. PyInstaller y cx_Freeze funcionan realmente muy bien, además, son multiplataforma, una gran ventaja frente a py2exe.

      Un saludo.

Deja una respuesta