Generar archivo ejecutable con cx_Freeze, PyInstaller y py2exe



Más que un artículo, un recordatorio o cheat sheet con las principales herramientas (y sus respectivos comandos) para crear archivos ejecutables de una forma rápida y eficaz, asumiendo que éstas ya están instaladas en vuestros sistemas.

cx_Freeze

Versión: 2.6+, 3.x.
Plataformas: todas las soportadas por Python.

El método más sencillo para obtener un archivo ejecutable es utilizando el script cxfreeze.

cxfreeze main.py

O bien:

python cxfreeze main.py

Este simple comando invoca a cx_Freeze para transformar el fichero main.py (junto con todos los módulos que éste importe) en un archivo ejecutable.

En sistemas Microsoft Windows, cxfreeze está localizado dentro de la carpeta Scripts en el directorio de instalación de Python. Por lo tanto, una invocación se vería, por ejemplo, de la siguiente forma.

C:\Python34\scripts\cxfreeze main.py

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

cxfreeze --icon=archivo.ico main.py

En Microsoft Windows, puede ocultarse la consola implementando la opción --base-name=Win32GUI.

cxfreeze --base-name=Win32GUI --icon=archivo.ico main.py

El script creará automáticamente un fichero llamado main.spec, que contiene las opciones generales para cx_Freeze, y la carpeta dist, en donde se encontrará el archivo ejecutable.

PyInstaller

Versión: 2.6+, 3.x.
Plataformas: Microsoft Windows y Linux.

Se invoca al archivo pyinstaller.py y se especifica el nombre del archivo principal que se desea convertir.

pyinstaller.py main.py

Al igual que cx_Freeze, la opción --icon es utilizada para indicar un ícono.

pyinstaller.py --icon=archivo.ico main.py

La opción --noconsole permite, lógicamente, ocultar la consola.

pyinstaller.py --noconsole --icon=archivo.ico main.py

PyInstaller brinda la posibilidad de incluir todas las dependencias en un único archivo vía la opción --onefile.

pyinstaller.py --onefile --noconsole --icon=archivo.ico main.py

Cabe aclarar que dicha opción resultará en un tiempo mayor de inicialización del programa.

Además, 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 el compresor (por ejemplo, --upx-dir=C:/upx.)

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. Esta opción requiere del paquete pycrypto.

Al finalizar, el archivo ejecutable se encontrará en la carpeta dist (junto con todas sus dependencias, si no se ha especificado la opción --onefile). La carpeta build creada durante la ejecución de PyInstaller puede ser eliminada.

py2exe

Versión: 2.x, 3.x.
Plataformas: Microsoft Windows.

Es una extensión de distutils que añade la opción py2exe.

Se crea un archivo llamado setup.py, indicando el nombre del archivo principal.

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

from distutils.core import setup
import py2exe

setup(
    console=[{"script": "main.py"}]
)

Luego, se llama a éste con 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 indicar una imagen como ícono, debe utilizarse la opción icon_resources.

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

Únicamente en Python 3 pueden incluirse todas las dependencias en un único archivo, similar a la opción --onefile de PyInstaller.

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



16 comentarios.

  1. 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

  2. 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,

  3. 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