Cómo convertir un script Python en .EXE con PyInstaller (Guía completa paso a paso)
En esta guia documento el proceso completo para convertir un script de Python en un archivo .EXE en Windows, de modo que puedas ejecutarlo con doble clic sin abrir Spyder y sin depender de correr el .py. Incluye soluciones reales a problemas que aparecieron durante la compilacion: conflictos de paquetes en Anaconda, falta de espacio en disco y el bloqueo de Windows Defender.
Que hace el .EXE que construimos
- Busca imagenes
.pngen la misma carpeta donde esta el.exe. - Convierte cada PNG a
.jpg. - Redimensiona a 960 px de ancho y mantiene la proporcion (alto automatico).
- Crea una carpeta
resultadosi no existe y guarda ahi las conversiones. - Sobrescribe si ya existe un JPG con el mismo nombre.
- Maneja transparencias componiendo sobre fondo blanco.
Requisitos
- Windows 10 u 11
- Python 3.x instalado (en nuestro caso Python 3.10)
- Acceso a CMD (Simbolo del sistema)
Paso 1: Verificar que estas en CMD y que Python es 3.x
Para compilar un .EXE debes usar CMD, donde el prompt se ve como C:\Users\TuUsuario>. Si ves >>> estas dentro del interprete de Python y los comandos como cd o pip no funcionaran.
python --versionDebe responder algo como Python 3.10.x. Si se abrio el interprete (sale >>>), cierralo con:
exit()Paso 2: Instalar PyInstaller y Pillow
Pillow se usa para abrir y convertir imagenes. PyInstaller es el empaquetador que genera el .EXE.
python -m pip install pyinstaller pillowPaso 3: Ir a la carpeta donde esta tu script
Ubica tu archivo .py (por ejemplo script_png_to_jpg.py) y entra a esa carpeta con cd. Si tu carpeta tiene espacios, usa comillas.
cd "C:\Users\Cesar\Downloads\script png to jpg"Paso 4: Crear el .EXE
Opcion A: Crear el .EXE sin ventana negra (sin consola)
python -m PyInstaller --clean --onefile --noconsole script_png_to_jpg.pyCuando finaliza correctamente veras un mensaje como Building EXE from EXE-00.toc completed successfully. y el .EXE quedara en la carpeta dist.
Opcion B: Crear el .EXE con ventana negra (con consola, util para depurar)
python -m PyInstaller --clean --onefile script_png_to_jpg.pyDonde queda el .EXE
Dentro de la misma carpeta del proyecto se crea:
dist\script_png_to_jpg.exe
Como usar el .EXE
- Copia
script_png_to_jpg.exedentro de la carpeta donde estan tus PNG. - Haz doble clic al .EXE.
- Se creara
resultadosi no existe y ahi apareceran los JPG convertidos. - Si ya existian archivos con el mismo nombre se sobrescriben.
Script final portatil
Este script toma como base la carpeta donde esta el .EXE (o el .py cuando lo ejecutas normal), crea resultado si no existe, convierte PNG a JPG, redimensiona a 960 px de ancho y sobrescribe si ya hay archivos con el mismo nombre.
from pathlib import Path
from PIL import Image
import sys
ANCHO_OBJETIVO = 960
CALIDAD_JPG = 90
def carpeta_del_ejecutable_o_script() -> Path:
if getattr(sys, "frozen", False):
return Path(sys.executable).resolve().parent
return Path(__file__).resolve().parent
def convertir_png_a_jpg_960(png_path: Path, carpeta_salida: Path) -> None:
with Image.open(png_path) as im:
w, h = im.size
if w <= 0:
return
nuevo_h = round(h * (ANCHO_OBJETIVO / w))
im_rgba = im.convert("RGBA").resize((ANCHO_OBJETIVO, nuevo_h), Image.LANCZOS)
fondo = Image.new("RGBA", im_rgba.size, (255, 255, 255, 255))
compuesto = Image.alpha_composite(fondo, im_rgba).convert("RGB")
out_path = carpeta_salida / f"{png_path.stem}.jpg"
compuesto.save(out_path, "JPEG", quality=CALIDAD_JPG, optimize=True)
def main():
base = carpeta_del_ejecutable_o_script()
pngs = list(base.glob("*.png")) + list(base.glob("*.PNG"))
salida = base / "resultado"
salida.mkdir(exist_ok=True)
if not pngs:
print("No se encontraron PNG en:", base)
return
for p in pngs:
try:
convertir_png_a_jpg_960(p, salida)
print("OK:", p.name)
except Exception as e:
print("Error con:", p.name, "|", e)
print("Listo. Salida en:", salida)
if __name__ == "__main__":
main()Notas sobre calidad JPG
CALIDAD_JPG = 90 controla la compresion del JPEG. Un valor mas alto (por ejemplo 95) conserva mas detalle pero genera archivos mas pesados. Un valor mas bajo reduce el peso pero puede degradar texto fino o bordes.
Problemas reales y soluciones
1) Conflicto en Anaconda: pathlib incompatible con PyInstaller
Al compilar en Anaconda puede aparecer un conflicto con el paquete pathlib (backport obsoleto). La solucion fue eliminarlo, porque Python ya incluye pathlib en la libreria estandar.
conda remove pathlibAlternativa si fuera necesario:
pip uninstall pathlib2) Falta de espacio: No space left on device
PyInstaller necesita espacio temporal. Si el disco esta lleno la compilacion falla. Solucion: liberar espacio y borrar artefactos previos del proyecto.
rmdir /s /q build
rmdir /s /q dist
del /q script_png_to_jpg.spec3) Bloqueo de Windows Defender: WinError 225
Windows Defender puede bloquear la creacion del .EXE por falso positivo. Se soluciono desactivando temporalmente la proteccion en tiempo real solo durante la compilacion, o agregando una exclusion para la carpeta del proyecto. Luego se recompila con:
python -m PyInstaller --clean --onefile --noconsole script_png_to_jpg.py4) Archivo no encontrado por nombre mal escrito
Si aparece not found, casi siempre es por un nombre mal tipeado o por ejecutar el comando en otra carpeta. Verifica con:
dir