Saltar al contenido

Instalador de Windows para una app Python (PyInstaller a Setup.exe)

Congela un programa Python con PyInstaller y envuelve el resultado en un instalador de Windows de verdad, con accesos directos y desinstalador. Por qué onedir supera a onefile para instaladores y qué ajustes importan.

Actualizado el 31 de octubre de 2026 · 3 min de lectura

PyInstaller convierte un programa Python en un .exe de Windows que funciona sin tener Python instalado. Lo que no hace es instalar ese programa: sin entrada en el menú Inicio, sin desinstalador, nada en la Configuración de Windows. Para eso hay que envolver la salida de PyInstaller en un instalador. Este es el camino completo, del script al Setup.exe.

Paso 1: congelar la app con PyInstaller

Instala PyInstaller en el entorno del proyecto y compila desde la carpeta donde está tu script de entrada:

pip install pyinstaller
pyinstaller --noconsole --onedir --name MyApp --icon app.ico main.py

Qué hace cada opción:

  • --onedir (la opción predeterminada) genera una carpeta dist/MyApp/ con MyApp.exe y una carpeta _internal/ de bibliotecas. Usa esta opción para instaladores. Arranca más rápido que --onefile, porque no hay que descomprimir nada en una carpeta temporal en cada inicio, y llama menos la atención de las heurísticas de los antivirus.
  • --noconsole oculta la ventana negra de consola en apps gráficas (Tkinter, PyQt, Kivy, etc.). Omítela en herramientas de línea de comandos.
  • --icon app.ico incrusta el icono en el .exe. Conserva el mismo .ico para el instalador.
  • --name MyApp da nombre al ejecutable y a la carpeta de salida.

Los archivos de datos que tu programa abre en tiempo de ejecución (imágenes, plantillas de configuración, modelos) deben añadirse con --add-data "src;dest" o en el archivo .spec; de lo contrario no estarán en dist/MyApp/.

Abre dist/MyApp/MyApp.exe y comprueba que la app funciona. Si puedes, copia la carpeta dist/MyApp completa a otro PC con Windows sin Python y ejecútala también allí.

Paso 2: comprimir la carpeta de salida

Comprime en zip el contenido de dist/MyApp/: MyApp.exe y _internal/. No incluyas build/, el archivo .spec ni tu árbol de código fuente. El zip es lo que se instala, byte a byte.

Paso 3: generar el instalador

  1. Sube el zip a ExeTup. Detecta MyApp.exe como programa principal.
  2. Introduce el nombre de la app, la versión, el editor y, si quieres, una licencia.
  3. Elige todos los usuarios (Program Files, aviso de administrador) o usuario actual (sin permisos de administrador). Las herramientas que se reparten entre compañeros suelen funcionar mejor por usuario.
  4. Elige la arquitectura. PyInstaller compila para el Python con el que lo ejecutaste, así que un Python de 64 bits produce una app de 64 bits.
  5. Sube app.ico, activa los accesos directos que quieras y genera el instalador.
  6. Descarga Setup.exe y pruébalo en Windows.

Notas específicas de Python

  • Falsos positivos de antivirus. Los paquetes de PyInstaller son un blanco frecuente de heurísticas antivirus demasiado cautelosas, sobre todo las compilaciones --onefile. Una compilación onedir dentro de un instalador normal, colocada en Program Files, se comporta como cualquier otro programa y es menos probable que se marque. La firma de código ayuda todavía más.
  • Tamaño. Una app Tkinter ocupa de 20 a 40 MB; PyQt, NumPy o PyTorch lo elevan mucho más. La compresión LZMA del instalador suele reducirlo a la mitad. Excluye los módulos que no uses con --exclude-module para mantenerlo ligero.
  • Primer inicio. Como onedir no necesita descomprimir nada, el primer arranque es tan rápido como los siguientes.
  • Actualizaciones. Distribuye un nuevo instalador con un número de versión superior. Instalar sobre la versión anterior reemplaza los archivos en su sitio.
  • Herramientas de consola. Para un programa de línea de comandos, plantéate una instalación por equipo e indica a los usuarios la carpeta de instalación; el instalador no la añade al PATH.

Alternativas

Nuitka y cx_Freeze también producen una carpeta con un .exe; el paso del instalador es idéntico. Si prefieres escribir tú mismo el script del instalador, tanto NSIS como Inno Setup funcionan con la salida de PyInstaller.

Preguntas frecuentes

¿Debo usar --onefile u --onedir para un instalador?

--onedir. El instalador ya ofrece a los usuarios un único Setup.exe para descargar, así que no hay motivo para pagar el arranque lento y la descompresión en carpeta temporal de onefile. Onedir es además la opción predeterminada de PyInstaller.

¿Los usuarios necesitan tener Python instalado?

No. PyInstaller empaqueta el intérprete de Python y las bibliotecas en la carpeta, y el instalador coloca esa carpeta en el equipo del usuario.

¿Por qué Windows muestra una advertencia sobre mi instalador?

Las descargas nuevas y sin firmar activan Microsoft SmartScreen hasta que ganan reputación. Consulta la guía sobre SmartScreen para ver qué puedes hacer.

¿Puedo incluir una configuración de ejemplo o una carpeta de datos?

Sí. Añádela con --add-data de PyInstaller, para que quede dentro de _internal/, o agrégala en el paso «Otros archivos» de ExeTup para colocarla junto a MyApp.exe.

Guías relacionadas