fbpixel
Etiquetas:
0
(0)

Puedes convertir un script Python en un archivo ejecutable (EXE) utilizando la librería PyInstaller. Una vez que tu código Python ha sido probado y validado, puedes compartirlo como una aplicación ejecutable de escritorio desde cualquier ordenador. Esto es especialmente útil para interfaces gráficas de usuario (GUI) como este monitor serie desarrollado en Python.

Estructura del proyecto

Para empezar, necesitamos estructurar nuestro proyecto adecuadamente. Para ello, utilizaremos la siguiente estructura de árbol

app/
│
├── resources
|   ├── logo.ico
|   ├── logo.png
|   ├── style.txt
├── app.py
├── LICENSE
├── README.md
├── requirements.txt
├── setup.py
└── tests.py
  • app.py contiene el código principal
  • logo.ico será el archivo de iconos utilizado tras la compilación
  • logo.png se utiliza en el software
  • style.txt contiene la definición del estilo CSS

En este tutorial, vamos a crear una interfaz sencilla usando PySide2 (también puedes usar PyQt) que contiene un botón que modificará los mensajes de la barra de depuración.

#!/usr/bin/python
# -*-coding:Utf-8 -*
"""
Created on Thu Nov 17 16:59:13 2022

@author: X.Wiedmer

Dummy app
Define a simple app to test PyInstaller
"""
import sys,os
#from PyQt5.QtWidgets import *
#from PyQt5.QtCore import *
#from PyQt5.QtGui import *
from PySide2.QtWidgets import *
from PySide2.QtCore import *
from PySide2.QtGui import *
pyqtSignal=Signal #translate pyqt to Pyside



# Generic app container     
def resource_path(relative_path):
	""" Get absolute path to resource, works for dev and for PyInstaller """
	try:
		# PyInstaller creates a temp folder and stores path in _MEIPASS
		base_path = sys._MEIPASS
	except Exception:
		base_path = os.path.abspath(".")

	return os.path.join(base_path, relative_path)


"""
App configuration
"""
__title__="DummyApp"
__version__="v0.1"	
style_path = resource_path("resources\\style.txt")
__icon__=resource_path("resources/logo.png")

class AcApp(QMainWindow):

	def __init__(self,title='DummyApp',mainFrame=QFrame):
		super().__init__()
		self.title=title
		self.mainFrame=mainFrame()
		self.initUI()

	def initUI(self):        
		#mainframe
		self.setCentralWidget(self.mainFrame)
		centralLayout=QHBoxLayout(self.mainFrame)
		
		#widgets
		self.button = QPushButton("Start")
		self.button.clicked.connect(self.clicked)
		centralLayout.addWidget(self.button)
	   
		#General configuration
		self.setWindowTitle(self.title)
		self.setGeometry(300, 300, 400, 200)
		self.setWindowIcon(QIcon(__icon__))
	   
		#Debug bar
		self.statusBar()
		self.statusBar().showMessage('Display debug messages')
	   
		self.show()

	def debugMsg(self,val):
		self.statusBar().showMessage(val)
	
	def clicked(self):
		if self.button.text() == "Start":
			self.debugMsg("Process started")
			self.button.setText("Stop") 
		else:
			self.debugMsg("Process stopped")
			self.button.setText("Start")    
  
def main():
	app = QApplication(sys.argv)
	app.setQuitOnLastWindowClosed(True)
	app.setStyleSheet(open(style_path).read()); #set style according to file 
	ex = AcApp(__title__+__version__)
	app.quit()
	sys.exit(app.exec_())
   
if __name__ == '__main__':
	main()

N.B.: Si desea que archivos como el icono se incluyan en el .EXE, deberá especificar la ruta absoluta en el script Python.

Para generar rutas absolutas automáticamente, puede utilizar la siguiente función

def resource_path(relative_path):
    """ Get absolute path to resource, works for dev and for PyInstaller """
    try:
        # PyInstaller creates a temp folder and stores path in _MEIPASS
        base_path = sys._MEIPASS
    except Exception:
        base_path = os.path.abspath(".")

    return os.path.join(base_path, relative_path)
	
style_path = resource_path("resources\\ac_style.txt")

Instalación del paquete PyInstaller

Para compilar el proyecto utilizamos la librería PyInstaller, que crea un archivo ejecutable que contiene todas las dependencias necesarias para ejecutar el código.

Antes de instalar pyinstaller, comprueba que C:\Users\ADMIN\AppData\Local\Programs\Python\Python38\Scripts está añadido a la Ruta de las variables de entorno.

python -m pip install pyinstaller==5.6.2

Nota: la versión 5.7.0 ya está disponible, pero muestra un error de permiso.

Configuración del archivo install_bat

Creamos un fichero install_app.bat que automatizará el proceso de compilación. En este archivo, especificamos el tipo de compilación (onefile, noconsole), las librerías (PySide2) y las carpetas que se incluirán en el ejecutable (resources).

python -m PyInstaller --noconfirm --log-level=WARN ^
    --onefile --noconsole ^
    --hidden-import=PySide2 ^
    --hidden-import=shiboken2 ^
    --add-data  ./resources;resources ^
    --icon=./resources/logo_araignee.ico ^
    app.py

PyInstaller creará las carpetas build, dist y un archivo app.spec

El archivo app.spec contiene las especificaciones de compilación y la carpeta que contiene el archivo EXE.

Limitaciones

PyInstaller no permite compilar para diferentes sistemas operativos desde la misma máquina. Para crear una aplicación Windows, necesitas usar PyInstaller en una máquina Windows. Tendrás que hacer lo mismo para Linux o MacOS.

Es posible la compilación cruzada para diferentes sistemas operativos utilizando un docker.

Fuentes

¿De cuánta utilidad te ha parecido este contenido?

¡Haz clic en una estrella para puntuarlo!

Promedio de puntuación 0 / 5. Recuento de votos: 0

Hasta ahora, ¡no hay votos!. Sé el primero en puntuar este contenido.

Ya que has encontrado útil este contenido...

¡Sígueme en los medios sociales!

¡Siento que este contenido no te haya sido útil!

¡Déjame mejorar este contenido!

Dime, ¿cómo puedo mejorar este contenido?