Hola, hoy vengo a dar un aporte, que es el siguiente: como convertir de .py a .exe
Bien, sin mas preámbulo empecemos:
Si estan en Windows:
1 - Primero de todo, necesitamos pywin32.
Para eso, vamos a la siguiente página: Python for Windows Extensions (https://sourceforge.net/projects/pywin32/files/pywin32/Build%20221/)
(https://i.imgur.com/OEoMF7x.png)
Acá, como vemos en la imagen, veremos muchas versiones para descargar.
La versión que quieras descargar depende de tu pc y de la versión de Python que usas.
En este caso, yo tengo un pc de 64 bits y uso Python 3.6, así que descargare la versión que dice: pywin32-221.win-amd64-py3.6.exe
Si tienes un pc de 32 bits y usas Python 3.6, descarga la versión que dice pywin32-221.win32-py3.6.exe
Si usas otras versiones de Python, ahí puedes elegir según la versión que tengas.
2 - Ahora instalaremos el módulo pyinstaller
Ahora tenemos que abrir el Símbolo de sistema (cmd) en modo administrador.
Para eso, presionamos la tecla Windows y la tecla "x", ahí les aparecerá lo siguiente "Símbolo de sistema (administrador)"
le das clic y le das permiso...
Otra seria buscar en la barra de tareas, y poner cmd, le dan clic derecho y de ahi le dan a "Ejecutar como administrador"
Ya, una vez ya abierto nuestro cmd en modo administrador, ponemos esto:
pip install pyinstaller
De ahi les cargara y esperan a que se termine de instalar.
(https://i.imgur.com/DHoDg4J.png)
En mi caso no lo instalo por que ya lo tengo instalado
Si quieren actualizar o ver si hay actualizaciones para el módulo pyinstaller
pongan: pip install --upgrade pyinstaller
Si quieren ver más; acá les dejo la página de pyinstaller: Pyinstaller Page (http://www.pyinstaller.org/downloads.html)
Ahí tienen la documentación y más información.
3 - Ahora viene lo divertido, compilamos de .py a .exe!
Creamos un programa cualquiera en Python:
print("Hola mundo!")
input("") # Es para evitar que se salga el programa
Ahora abrimos otra vez el cmd, esta vez en modo normal, presionando la tecla Windows y la tecla "r"
de ahi ponen cmd y dan a enter.
Una vez ya abierto el cmd, escribimos cd y seguido de de la ruta del archivo
Ejemplo:
cd C:\Users\usuario\Desktop\
No así:
cd C:\Users\usuario\Desktop\miprograma.py
(https://i.imgur.com/ASkl3R5.png)
Empieza lo divertido, convertir a .exe!
Escribimos ahora en el cmd lo siguiente:
pyinstaller nombre_del_programa.py
De ahi, presionas enter, y empieza a compilar!
(https://i.imgur.com/Mtq4ANV.png)
Suele tirar unas advertencias, sobre que falta un .dll, pero no hay de que preocuparse, por que el mismo pyinstaller los crea.
Ahora si nos fijamos, en la carpeta o donde sea donde estaba tu programa en .py, se crean 3 carpetas y 1 archivo
(https://i.imgur.com/RrPXQJY.png)
Por ahora nos interesaremos en la carpeta "dist", entramos a ella,
de ahí encontraremos una carpeta, entramos a ella, y veremos muchos archivos.
El que nos interesa ahora es el archivo compilado, tiene el nombre del archivo en .py que compilaste,
(https://i.imgur.com/OEABoAC.png)
Simplemente le damos clic y ahí esta! Nuestro programa en .exe!
(https://i.imgur.com/TaH6HmD.png)
Extras
-Poner icono al .exe
Si de casualidad quieren que su .exe tenga un icono personalizado, se hace lo siguiente:
Ojo! el icono tiene que estar en formato .ico
En mi caso, cree esta belleza del arte en GIMP (https://www.gimp.org/) xD
(https://i.imgur.com/BYjGHii.png)
Ahora vamos a cmd y escribimos:
pyinstaller nombre_de_nuestro_programa.py -i nuestroicono.ico
De ahí crea el .exe con el icono que hemos hecho!
-Si mi programa tiene interfaz gráfica (Tkinter, GTK+, PyQt5, etc) y no depende de la consola, como elimino la consola?
Es sencillo, hace lo siguiente:
pyinstaller nombre_de_nuestro_programa.py --noconsole
y listo.
-Como hago para solo generar el .exe, sin todos esos demás archivos?
Fácil, puedes hacer lo siguiente:
pyinstaller nombre_de_nuestro_programa.py --onefile
De ahí, como siempre genera 3 carpetas y un archivo, lo único que nos importa es la carpeta llamada "dist"
(https://i.imgur.com/W8VQ5Gl.png)
entramos a ella, y encotraremos el .exe de nuestro programa, lo movemos a otra carpeta, (en este caso lo muevo al escritorio)
Después, de haber movido el .exe a otra ubicación, borramos las carpetas y archivos generados por el pyinstaller.
(https://i.imgur.com/yOnucXg.png)
Y tenemos nuestro .exe, sin ningun archivo adicional más.
(https://i.imgur.com/1zKPU4r.png)
(Gracias a noxonsoftwares (https://underc0de.org/foro/profile/noxon/) por el aporte!)
Si estan en una distro de GNU/Linux:
No es necesario instalar pywin32, como antes, abrimos la consola y escribimos:
sudo pip3 install pyinstaller
(por defecto, en algunas distros el pip de Python no viene instalado, si no viene instalado, escribimos esto:)
wget https://bootstrap.pypa.io/get-pip.py
sudo python3 get-pip.py
Una vez hecho todo esto, se puede hacer lo mismo mencionado anteriormente con pyinstaller. La diferencia es que en GNU/Linux, genera un ejecutable
(no un .exe). Para ejecutarlo, escribimos en la consola:
./nombre_de_nuestro_programa
y se va a ejecutar.
Muchas gracias por leer, si tienes una duda, algo no ha funcionado, etc, no dudes en comentar.
Gracias ;)
Hola bro!
Esta muy bueno y muy completo!! Te felicito por tan buen material!
Gracias por traerlo a Underc0de!!
Saludos,
ANTRAX
Gracias! Prontro quisas alga más tutoriales sobre Python u otras cosas :D
buen tutorial. bien detallado.
Anexo algo.... para no tener el .exe y los archivos por separado se coloca --onefile .
saludos
Muchas gracias, y muy bien explicado.
si mi archivo python tiene dependencias de paquetes y algunas imagenes, como lo haria?
No tienes permitido ver los links.
Registrarse o Entrar a mi cuenta
si mi archivo python tiene dependencias de paquetes y algunas imagenes, como lo haria?
Ya agrega las dependencias.
Hola buenas estoy teniendo problemas a la hora de compilar a .exe una aplicación de escritorio, he leído que no hace falta incluir las dependencias? Mi aplicación trabaja con muchos paquetes y librerías externas, y me está dando este error:
Traceback (most recent call last):
File "main.py", line 21, in <module>
File "C:\Users\Alfredo\Anaconda3\lib\site-packages\PyInstaller\loader\pyimod03_importers.py", line 631, in exec_module
exec(bytecode, module.__dict__)
File "site-packages\pandas\__init__.py", line 35, in <module>
ImportError: C extension: No module named 'pandas._libs.tslibs.np_datetime' not built. If you want to import pandas from the source directory, you may need to run 'python setup.py build_ext --inplace --force' to build the C extensions first.
[11824] Failed to execute script main
No hay que crear un archivo setup.py ni nada por el estilo? Si alguien pudiera ayudarme le estaría muy agradecido, un saludo.
excelente me gustó mucho! al convertirlo en exe y pasarlo a otra pc que no tiene nada de python funciona o tengo que instalarle el python, modulos, etc?
soy noob me disculpan si es muy obvio.
Excelente explicación! a mi me encanta como funciona la librería PyInstaller, de hecho en algún vídeo mio compilo una GUI con este paquete. Gracias por el aporte, un saludo amigo!
Hola, tengo un problema con el icono, con: pyinstaller nombre_de_nuestro_programa.py -i nuestroicono.ico --noconsole --onefile
Crea el .exe con todo su icono pero a al abrirlo " Failed to execute script miprograma "
Cuando copio el icono (que cree junto con el script dentro del python) junto al exe, si se ejecuta perfectamente con sus iconos.
el exe Depende del icono que esta en el script que he creado.
¿Como hago para que no dependa del icono ?
Gracias
@royer14 (https://underc0de.org/foro/index.php?action=profile;u=71604) @alfredo89 (https://underc0de.org/foro/index.php?action=profile;u=84236) Lo que podés hacer es lo siguiente:
Crear un archivo .spec del script
En el CMD coloca lo siguiente:
- pyi-makespec --paths=<directorio donde se alojan las dependencias> <archivo principal>
En mi caso, me quedaría algo como esto:
- pyi-makespec --paths=C:\Programa\Dependencias principal.py
Y verás como se generará el archivo .spec
Creando .exe con archivo .spec
Con el archivo .spec generado, pasaremos a utilizar la siguiente sintaxis para generar el .exe
- pyinstaller <archivo.spec>
En mi caso, quedaría algo como esto:
- pyinstaller principal.spec
Y finalmente, se crearán las dos carpetas "dist" y "build", donde en el dist tendrás el archivo ejecutable creado.
Espero que te sirva. Saludos!
Hola.
Todo bien.
Pero cuando saco el .exe de la carpeta, deja de funcionar.
¿?
¿De qué archivo tiene dependencia?
Gracias
.
@Girardelli (https://underc0de.org/foro/index.php?action=profile;u=119619)
¿Estás usando el parámetro --onefile?, porque si no, el ejecutable dependerá de las librerías que se encuentren en su ubicación y fallará.
Y si no es el caso que planteé, dé más información útil, ya sea una captura de pantalla o el resultado al concluir la ejecución del comando.
~ DtxdF
Ok.
Muchas gracias.
En efecto, no había leído bien todo el post.
Ahora va bien.