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")]}]
)



5 comentarios.

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