====== PyInstaller (sous Windows) ====== Doc de **PyInstaller** : [[https://www.pyinstaller.org/]] Didacticiel : [[https://medium.com/lifeandtech/executable-gui-with-python-fc79562a5558|Executable GUI with Python. using Tkinter and Pyinstaller]] ===== Installation ===== Activer (ou créer) un environnement virtuel : c:\monprojet> venv\scripts\activate Installer **PyInstaller** : (venv) c:\monprojet> pip install pyinstaller :!: Sous Python 3.10 impossible d'installer pyinstaller 5.6, j'ai donc forcé l'installation de pyinstaller 5.5 : (venv) c:\monprojet> pip install pyinstaller==5.5 ===== Création de l'exécutable ===== **Méthode 1 : création d'un dossier avec l'exécutable et les dépendances** (venv) c:\monprojet> pyinstaller --noconfirm --onedir --windowed test.py * Génère un exécutable **test.exe** dans un dossier **dist** * Les dépendances se trouvent dans un sous-dossier **_internal** **Méthode 2 : création d'un unique exécutable contenant tout** (venv) c:\monprojet> pyinstaller --noconfirm --onefile --windowed test.py * Génère un **unique** exécutable **test.exe** dans un dossier **dist** * :!: L'exécution de cette version de l'exécutable est **beaucoup plus lente**, car les dépendances doivent d'abord être extraites en mémoire **Générations suivantes :** La première génération écrit un dossier **test.spec** qui peut être édité afin de modifier les options de génération. Après modification, la commande de régénération se résume à : (venv) c:\monprojet> pyinstaller test.spec ===== Inclure des packages ===== Application utilisant **CustomTKinter** : Voir [[https://github.com/TomSchimansky/CustomTkinter/wiki/Packaging#windows-pyinstaller-auto-py-to-exe]] (venv) c:\monprojet> pyinstaller --noconfirm --onefile --windowed --add-data "./venv/lib/site-packages/customtkinter;customtkinter/" test.py ===== Fichier .spec ===== # -*- mode: python ; coding: utf-8 -*- a = Analysis( ['leuze.py'], # Nom du script principal pathex=[], binaries=[], datas=[], hiddenimports=[], hookspath=[], hooksconfig={}, runtime_hooks=[], excludes=[], noarchive=False, ) pyz = PYZ(a.pure) exe = EXE( pyz, a.scripts, [], exclude_binaries=True, name='wxLeuze', # Nom de l'exécutable : wxLeuze.exe debug=False, bootloader_ignore_signals=False, strip=False, upx=True, console=False, disable_windowed_traceback=False, argv_emulation=False, target_arch=None, codesign_identity=None, entitlements_file=None, ) coll = COLLECT( exe, a.binaries, a.datas, strip=False, upx=True, upx_exclude=[], name='wxLeuze', # Nom du sous-dossier : \dist\wxLeuze\ )