En este blog han pasado varios temas desde el desarrollo de juegos hasta programación de aplicaciones con #tkinter, incluso aplicaciones de terminal y aún faltan más temas por tratar que a medida que vaya experimentando con distintos módulos iré plasmando en este blog.
Supongamos que hemos creado una aplicación que queremos compartir con un amigo o con la comunidad, en nuestro estado actual tendríamos que decirle a nuestro amigo que no es programador, que debe instalarse Python, que debe instalarse módulos abriendo una terminal y escribiendo el comando pip y pasarle la lista de dependencias y posiblemente al ejecutarlo encuentre problemas. La solución a eso sería crear un archivo ejecutable y si este ejecutable es un archivo todo en uno, no habrá problema.
En los paquetes de Python existen varias alternativas para compilar o más bien empaquetar nuestros archivos de código de Python a archivos ejecutables.
En Windows esta:
Auto py to exe $pip install auto-py-to-exe.
py2exe $pip install py2exe
pyinstaller $pip install pyinstaller
cx_freeze $pip install cx-freeze
En Linux esta:
pyinstaller $pip install pyinstaller (multiplataforma y el que usaremos aquí)
Buildozer $pip install buildozer (es multiplataforma, pero se usa para crear aplicaciones de android con interfaz kivy)
cx-freeze $pip install cx-freeze (multiplataforma)
En mi caso probé instalarlo en ZorinOS y no tuve problema alguno, pero si tienes algún problema, lee atentamente las dependencias que necesita e instálalas con el comando pip.
Para el ejemplo haremos dos códigos muy simples, un hola mundo que se ejecuta en una terminal y un hola mundo con interfaz gráfica usando tkinter.
# holamundo.py
def main():
print('Hola mundo')
if __name__ == '__main__':
main()
# holaGUI.py
import tkinter
class Application(tk.Frame):
def __init__(self,parent):
super().__init__(parent)
tk.Label(parent,text = 'Hola mundo!').pack()
def main():
root = tk.Tk()
root.title('Hola mundo aplicacion')
application = Application(root)
root.mainloop()
if __name__ == '__main__':
main()
la manera más fácil de hacer un ejecutable con #pyinstaller, es ir a la carpeta donde se encuentra nuestro script holamundo.py abrir el terminal en esa carpeta y escribir el siguiente comando.
$pyinstaller holamundo.py
Esto creará varias carpetas, pero destacables están la carpeta build y dist, la que nos importa es la carpeta dist, si miras los archivos encontraras un ejecutable con el mismo nombre que la aplicación sin extensión en el caso de Linux, si lo has compilado para Windows lo veras con la extensión *.exe.
Como holamundo.py es una aplicación de terminal, debes ejecutarlo desde la terminal para que funcione.
Si has visto dentro de la carpeta dist, veras que hay un montón de archivos, pero si quieres que solo sea un archivo autocontenido debes ejecutar el siguiente comando al compilar.
$pyinstaller --onefile holamundo.py
Ahora vamos al caso del código con interfaz gráfica, cuando probamos el código, se abren dos ventanas, una contiene la interfaz gráfica y la otra contiene la terminal que nos devuelve los errores, pero al momento de compilar nosotros no queremos que la ventana de la terminal aparezca de fondo, para eso compilaremos con la siguiente instrucción.
$pyinstaller --onefile --windowed holaGUI.py
Con esta instrucción estamos compilando en un archivo y en modo ventana, con esto evitaremos que se muestre la ventana de terminal. Si quieres que tu aplicación tenga un icono personalizado.
$ pyinstaller --icon = ./path/icon.ico holaGUI.py
El icono preferiblemente que esté en la misma ruta del archivo ejecutable y muy importante, este debe ser una imagen.ico
Nota: En algunas distribuciones como Debian el comando pyinstaller no funciona directamente, otra forma de usarlo es ejecutando el modulo directamente:
$python3 -m PyInstaller holamundo.py
Ahora hay algunas cosas que hay que saber, he mencionado la palabra compilar varias veces, pero esto no es cierto, esto simplemente empaqueta nuestro código y lo ejecuta directamente con el intérprete de Python, haciendo que no nos demos cuenta de cuando es que el intérprete ejecuta nuestro script, así que no espere un rendimiento extra como si convirtiera nuestro código en lenguaje maquina o algo así.
Si por algún motivo te da problemas al compilar o empaquetar, revisa que no estes usando la función help(), exit() o cualquier función reflexiva de Python, pues esto daña la compilación.
No todas las dependencias tienen soporte a ser construidas, para saber que paquetes son compatibles dejo aquí el siguiente link.
Espero que esto haya sido de ayuda, no hay nada más que te haga sentir programador como ver los ejecutables de tus programas funcionando sin brujerías raras. No siendo más nos vemos en un próximo post.
Comments