Al desarrollar aplicaciones en Python, un desafío común es distribuir software sin requerir entornos de ejecución preinstalados. Compilar scripts en ejecutables nativos resuelve problemas de compatibilidad y facilita la implementación en sistemas sin configuración previa de Python.
PyInstaller: Solución Multiplataforma
Esta heramienta genera binarios ejecutables para Windows, Linux y macOS. Su capacidad para manejar dependencias implícitas la hace especialmente útil en proyectos complejos.
Instalación básica:
pip install pyinstaller
Ejemplo de empaquetado con configuración avanzada:
# configuracion_empaquetado.py
import sys
from PyInstaller.__main__ import run
opciones = [
'app_principal.py',
'--onefile',
'--windowed',
'--icon=recursos/icono_app.ico',
'--add-data="recursos;recursos"',
'--hidden-import=pymysql',
'--upx-dir=/ruta/upx'
]
run(opciones)
Para aplicaciones con procesos múltiples, incluya esta línea crítica antes de la ejecución principal:
if __name__ == "__main__":
import multiprocessing
multiprocessing.freeze_support()
iniciar_aplicacion()
Características destacadas:
- Empaquetado único con
--onefile - Soporte automático para bibliotecas como PyQt
- Compresión binaria mediante UPX
- Gestión de recursos externos con
--add-data
cx_Freeze: Enfoque Modular
Ideal para proyectos que requieren estructura de directorios preservada. Se configura mediante un script de construcción específico.
# construir_exe.py
import cx_Freeze
config_ejecutable = cx_Freeze.Executable(
script="modulo_principal.py",
base="Win32GUI",
icon="recursos/icono_app.ico"
)
configuracion = cx_Freeze.setup(
name="MiAplicacion",
version="1.0",
options={"build_exe": {"packages": ["sqlalchemy"], "include_files": ["recursos/"]}},
executables=[config_ejecutable]
)
Ejecutar proceso de compilación:
python construir_exe.py build
Consideraciones clave:
- Los recursos deben ubicarse en rutas relativas al ejecutable
- Evite espacios y caracteres no ASCII en rutas de despliegue
- Para interfaces sin consola, use
base="Win32GUI" - Requiere redistribución de archivos DLL como msvcr100.dll
Nuitka: Compilación a Código Nativo
Transforma código Python en C++ optimizado, generando ejecutables independientes con mejor rendimiento. Requiere compilador C++ compatible.
python -m nuitka \
--standalone \
--enable-plugin=qt-plugins \
--windows-icon-from-ico=recursos/icono_app.ico \
--remove-output \
modulo_principal.py
Ventajas principales:
- Ejecución más rápida mediante optimización nativa
- Protección parcial contra ingeniería inversa
- Manejo automático de dependencias complejas
Limitaciones:
- Tiempos de compilación extensos (varios minutos)
- Requiere instalación de MinGW o Visual Studio Build Tools
- Alto consumo de recursos durante compilación
py2exe: Enfoque Histórico
Aunque actualmente es menos recomendado, sigue siendo una opción para entornos Windows heredados. Su configuración básica utiliza:
# empaquetar.py
from distutils.core import setup
import py2exe
setup(
console=['app.py'],
options={
'py2exe': {
'bundle_files': 1,
'compressed': True,
'excludes': ['unittest']
}
},
zipfile=None
)
Desventajas críticas:
- Compatibilidad limitada entre versinoes de Windows
- Dependencia de archivos DLL específicos del sistema
- Falta de soporte para bibliotecas modernas
- Problemas frecuentes con recursos empaquetados