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 carpetadist/MyApp/conMyApp.exey 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.--noconsoleoculta la ventana negra de consola en apps gráficas (Tkinter, PyQt, Kivy, etc.). Omítela en herramientas de línea de comandos.--icon app.icoincrusta el icono en el.exe. Conserva el mismo.icopara el instalador.--name MyAppda 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
- Sube el zip a ExeTup. Detecta
MyApp.execomo programa principal. - Introduce el nombre de la app, la versión, el editor y, si quieres, una licencia.
- 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.
- 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.
- Sube
app.ico, activa los accesos directos que quieras y genera el instalador. - Descarga
Setup.exey 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-modulepara 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
- Cómo crear un Setup.exe para tu app de Windows (sin código)Qué hace realmente un Setup.exe, las tres formas de crear uno y cómo convertir la carpeta de tu app en un instalador profesional en minutos, sin escribir ningún script.
- Convertir un .exe en un instalador de Windows (exe a Setup.exe)Cómo convertir un .exe simple, o una carpeta que contiene un .exe, en un instalador de Windows real con accesos directos y desinstalador, sin escribir un script de instalación.
- «Windows protegió su PC»: qué significa el aviso de SmartScreen y cómo eliminarloPor qué Windows muestra el aviso de «editor desconocido» en un instalador nuevo, qué pueden pulsar los usuarios y cómo la firma de código y la reputación hacen que desaparezca.