Python / Compiler du code et créer des fichiers EXE
Pour distribuer du code Python sous forme d’EXE Windows, PyInstaller peut regrouper le programme, l’environnement d’exécution Python et les bibliothèques nécessaires. Un fichier .pyc produit par py_compile contient du bytecode Python, pas un EXE Windows autonome. Vérifiez d’abord un bundle en dossier, puis passez au fichier unique si nécessaire pour faciliter le diagnostic.
Compilation en bytecode et création d’un EXE
py_compile convertit les sources en fichiers de bytecode. PyInstaller rassemble interpréteur et dépendances dans une application distribuable. Il ne s’agit pas de traduire un programme Python ordinaire en code machine natif optimisé via C. Le regroupement n’accélère pas automatiquement l’exécution et ne protège pas sûrement le contenu des sources.
Le résultat dépend du système d’exploitation et de l’architecture. Créez les EXE Windows sous Windows : PyInstaller n’est pas un compilateur croisé qui les produit sous Linux avec une seule option. Vérifiez les environnements pris en charge et la compatibilité des paquets.
Préparer le dossier Windows et l’environnement virtuel
Utilisez PowerShell sous Windows avec Python 3 et pip installés. Ouvrez un terminal dans un nouveau dossier de travail et lancez les commandes dans l’ordre. Si py -3 n’est pas disponible, remplacez-le dans la première ligne par le chemin du Python installé ou une commande python qui désigne cet interpréteur.
py -3 -m venv .venv
.\.venv\Scripts\python.exe -m pip install "pyinstaller==6.22.3"
.\.venv\Scripts\python.exe -m PyInstaller --version
.venv est l’environnement virtuel du projet. Les commandes suivantes invoquent directement son Python : ni activation par script ni modification de la politique d’exécution PowerShell ne sont nécessaires. L’exemple fixe PyInstaller à 6.22.3 ; vérifiez de nouveau compatibilité et options si vous choisissez une autre version. L’installation doit réussir et la dernière commande afficher 6.22.3.
Installez les dépendances de votre application dans ce même environnement. Construire depuis un Python global chargé de paquets inutilisés peut compliquer l’analyse et la gestion du résultat.
Enregistrer un exemple complet et produire le bytecode
Créez hello.py en UTF-8 dans le dossier de travail :
print("Hello, packaging!")
Hello, packaging!
Exécutez d’abord la source ; elle doit afficher le message présenté ci-dessus.
.\.venv\Scripts\python.exe hello.py
Pour essayer uniquement la compilation en bytecode :
.\.venv\Scripts\python.exe -m py_compile hello.py
En cas de succès, normalement sans affichage, un fichier tel que hello.cpython-312.pyc apparaît dans __pycache__. Le marqueur de version dépend de Python. Le renommer en EXE ne le rend pas autonome : le bytecode nécessite un environnement Python compatible.
Construire et distribuer un bundle en dossier
Lancez ces commandes depuis le dossier de travail, la seconde seulement après la réussite de la construction.
.\.venv\Scripts\python.exe -m PyInstaller --onedir --name hello-folder hello.py
.\dist\hello-folder\hello-folder.exe
Le résultat est Hello, packaging!. Distribuez tout le dossier dist\hello-folder, avec l’EXE et ses fichiers de support. Copier seulement l’exécutable peut laisser des bibliothèques indispensables de côté. Les fichiers de support peuvent se trouver dans _internal ; la structure exacte dépend des paquets et options.
build contient les fichiers intermédiaires et de diagnostic ; hello-folder.spec enregistre les paramètres de construction. Les utilisateurs reçoivent le résultat de dist, pas vos dossiers build et .venv. La référence d’utilisation de PyInstaller détaille les options.
Créer un EXE unique
Une fois le format dossier fonctionnel, regroupez la même source en fichier unique. Un nom différent permet de conserver les deux résultats pour les comparer.
.\.venv\Scripts\python.exe -m PyInstaller --onefile --name hello-single hello.py
.\dist\hello-single.exe
dist\hello-single.exe se distribue seul et affiche le même message. Au démarrage, il extrait ses fichiers internes vers un emplacement temporaire, ce qui peut ralentir le lancement. Évaluez taille et vitesse sur l’application réelle sans supposer un avantage systématique.
N’ajoutez pas --windowed à cet exemple console. Cette option peut convenir à une interface graphique sans console, mais son usage systématique avec print() ou input() gêne les entrées-sorties et le diagnostic. Recherchez la cause plutôt que de faire de l’exécution administrateur ou de la désactivation des protections une solution par défaut.
Les exemples dossier et fichier unique ont été construits sous Windows avec Python 3.12.14 et PyInstaller 6.22.3, puis leur sortie a été vérifiée. Ces vérifications concernent des exemples console sur le même hôte, pas un autre PC sans Python ni une application graphique.
Inclure textes, images et autres données
Ne supposez pas que tous les fichiers lus par le code sont automatiquement collectés. Enregistrez message.txt en UTF-8 avec la ligne Hello from bundled data!. Créez à côté hello_data.py avec ce code complet :
from pathlib import Path
message = Path(__file__).resolve().with_name("message.txt")
print(message.read_text(encoding="utf-8").strip())
Hello from bundled data!
La source et le bundle suivant doivent afficher le même message. Un chemin fondé sur __file__ ne dépend pas du dossier courant du terminal et peut trouver les fichiers internes au bundle.
.\.venv\Scripts\python.exe -m PyInstaller --onefile --name hello-data --add-data "message.txt:." hello_data.py
.\dist\hello-data.exe
--add-data "message.txt:." place le fichier à la racine du bundle. Le séparateur de la documentation actuelle est le deux-points ; ne mélangez pas d’anciens exemples propres à un système. Faites correspondre les chemins aux règles d’inclusion des données pour images et configuration. Modifier des données extraites d’un EXE unique ne constitue pas un stockage persistant. Enregistrez réglages et résultats utilisateur dans un emplacement distinct accessible en écriture.
Diagnostiquer les échecs et vérifier la distribution
- Si l’EXE se ferme immédiatement, lancez-le depuis PowerShell plutôt que par double-clic pour lire l’erreur. Vérifiez d’abord que la source fonctionne dans le même environnement virtuel.
- Pour un module manquant, examinez son installation et la manière dont il est importé. Un import dynamique peut nécessiter des réglages supplémentaires. Lisez
build\nom\warn-nom.txt, sans considérer tous les avertissements comme fatals. - Pour des données absentes, comparez la destination de
--add-dataet le chemin du code. Revenez au format dossier pour examiner les fichiers et isoler le problème. - Testez les fonctions sur le système et l’architecture cibles : environnement distinct sans Python, accès aux fichiers, programmes externes et conditions de redistribution des paquets inclus.
Consultez le guide de dépannage de PyInstaller. Distinguez construction et exécution, puis consignez la source reproductible, les versions des paquets et les messages d’erreur pour faciliter le diagnostic.




