Créer un exécutable sous Windows à partir d’un programme Python
Si vous êtes comme moi, vous êtes sûrement frustré.e.s d’avoir créé un beau programme Python et de ne pas l’avoir en exécutable sous Windows.
Dans cet article, je vais vous montrer comment transformer votre fichier .py en fichier .exe.
Création d’un programme Python
Je vais partir d’un programme que j’avais déjà exposé (voir cet article), celui d’un chiffrement/déchiffrement affine, en l’améliorant un peu (pour prendre un cours sur le chiffrement, vous pouvez faire appel à mes services) :
alphabet=["A","B","C","D","E","F","G","H","I","J","K","L","M","N","O","P","Q","R","S","T","U","V","W","X","Y","Z",'a','b','c','d','e','f','g','h','i','j','k','l','m','n','o','p','q','r','s','t','u','v','w','x','y','z',"'","ù","é","è","à","ç","-","ê"," "] # Calcul du pgcd de a et b def pgcd(a,b): while b!=0: a,b=b,a%b return a # fonction de chiffrement affine def chiffrementAffine(a,b,L): x=alphabet.index(L) y=(a*x+b)%len(alphabet) return alphabet[y] # Calcul de l'inverse d'un nombre modulo 26 def inverse(a): x=0 while (a*x%len(alphabet)!=1): x=x+1 return x # Fonction de déchiffrement def dechiffrementAffine(a,b,L): x=alphabet.index(L) y=(inverse(a)*(x-b))%len(alphabet) return alphabet[y] # Affichage du mot chiffré def crypt(M,a,b): if (pgcd(a,len(alphabet))==1): mot = [chiffrementAffine(a,b,i) for i in M] return "".join(mot) else: return "Chiffrement impossible. Veuillez choisir un nombre a premier avec"+str(len(alphabet))+"." # Affichage du mot déchiffré def decrypt(M,a,b): if (pgcd(a,len(alphabet))==1): mot = [dechiffrementAffine(a,b,i) for i in M] return "".join(mot) else: return "Déchiffrement impossible. Le nombre a n'est pas premier avec"+str(len(alphabet))+"." # Menu def menu(): print('Menu du jour...\n----------------') print('1. Chiffrer un message') print('2. Déchiffrer un message\n-----------------------\n') choix = int(input('Quel est votre choix ? ')) if choix == 1: chiffrer() elif choix == 2: dechiffrer() else: print('Can you be serious please... ?\n') menu() # Retour au menu ? def return_menu(): rep = input('\nSouhaitez-vous revenir au menu (O/N) ? ') if rep.upper() == 'N': the_end() elif rep.upper() == 'O': menu() else: print('Can you be serious please... ?\n') return_menu() # the_end() def the_end(): print("Ok. C'est vous qui voyez... See you soon !") # chiffrer def chiffrer(): msg = input('Entrez le message à chiffrer : ') a = int(input('Entrez la première clé : ')) b = int(input('Entrez la seconde clé : ')) print('Le chiffrement donne : ',crypt(msg,a,b)) return_menu() def dechiffrer(): msg = input('Entrez le message à déchiffrer : ') a = int(input('Entrez la première clé : ')) b = int(input('Entrez la seconde clé : ')) print('Le chiffrement donne : ',decrypt(msg,a,b)) return_menu() menu()
Ce programme, je vais le sauvegarder sous le nom chiffrement.py.
Construction de l’exécutable windows
Avec PyInstaller
Installation du module (s’il n’est pas déjà installé)
Allez en ligne de commande. Pour cela, allez dans la recherche Windows et tapez “cmd”.
Ensuite, tapez la commande suivante :
python -m pip install PyInstaller
Création de l’exécutable windows
En ligne de commande, je vais dans le répertoire où se trouve le fichier Python, puis je tape :
pyinstaller <nom du fichier.py>
Sous windows, deux répertoires se créent alors : dist et build. Dans dist se trouve un répertoire du nom de votre fichier py dans lequel se trouve l’exécutable.
Et voilà ! Votre fichier python exécutable windows est prêt !
Pour les abonné.e.s de ce site, je mets le ZIP correspondant sur cette page.
Avec le module cx_Freeze
Avec ce module, je dois créer un fichier setup.py dans le même dossier que chiffrement.py.
Dans un cas général, la structure du fichier setup.py pourra être de la forme suivante:
# commande à taper en ligne de commande après la sauvegarde de ce fichier: # python setup.py build from cx_Freeze import setup, Executable executables = [ Executable(script = "nom_du_fichier_principal.py",icon = "nom_de_l_icone.ico", base = "Win32GUI" ) ] # ne pas mettre "base = ..." si le programme n'est pas en mode graphique, comme c'est le cas pour chiffrement.py. buildOptions = dict( includes = ["module1","module2","module3",...], include_files = ["fichier1.txt", "mon_icone.ico"] ) setup( name = "nom_du_programme", version = "1.2", description = "description du programme", author = "votre nom", options = dict(build_exe = buildOptions), executables = executables )
Quelques remarques concernant buildOptions :
- includes est une liste de tous les modules appelés dans le programme principal python (par exemple, tkinter, random, …);
- include_files est une liste de tous les fichiers externes nécessaires au fonctionnement du programme principal (par exemple, un fichier texte, une icone, …).
Ainsi, dans le terminal Windows, après s’être placé·e dans le dossier du fichier python principal, on tape:
python setyp.py build
et un dossier “build” est créé, dans lequel un dossier “exe.win32-3.8” est créé (“3.8” est la version de Python utilisée). Dans ce cernier, on trouvera tout ce qu’il faut pour exécuter le fichier exe créé.
Comparatif
Avec pyinstaller, il y a moins d’options, mais le dossier dist est plus léger que celui créé avec cx_Freeze.
À titre de comparaison, pour le jeu du pendu que j’ai créé, la taille du dossier créé est :
- 20 Mo avec pyinstaller;
- 39 Mo avec cx_Freeze.
Mais ce programme tournant avec une interface graphique (tkinter),
- la fenêtre graphique se lance au-dessus d’une fenêtre DOS quand le fichier exe est créé avec pyinstaller, et l’icône est standard;
- avec l’option (base = “Win32GUI”), le programme créé avec cx_Freeze lance la fenêtre graphique directement, et l’icône du fichier exe est celui que j’ai souhaité.
Il vous appartient donc de voir ce que vous souhaitez privilégier.
Créer un installateur
Une fois tout ça fait, si vous souhaitez distribuer votre programme, vous pouvez bien entendu compresser le tout dans un ZIP (par exemple), mais vous pouvez aussi créer un installateur. C’est ce que j’ai fait pour le jeu du pendu.
J’utilise personnellement Inno Setup Compiler. C’est un peu compliqué au début, mais après plusieurs essais, on arrive à faire ce que l’on veut. Il faut juste se laisser guider par le mode “Wizard”.

Il y a ensuite quelques fenêtres qui vont s’afficher et il faudra compléter les champs proposés.
Articles relatifs:
Stéphane Pasquet
Laissez votre message
Annuler la réponse
Laissez votre message
Derniers articles
Commentaires récents
- Stéphane Pasquet dans Manipuler sa webcam en Python
- Cimawills dans Manipuler sa webcam en Python
- Stéphane Pasquet dans Créer un exécutable sous Windows à partir d’un programme Python
- GILBERT dans Créer un exécutable sous Windows à partir d’un programme Python
- Salah dans Créer un exécutable sous Windows à partir d’un programme Python
One thought on “Créer un exécutable sous Windows à partir d’un programme Python”
IBRADPublié le 8:14 - Mar 27, 2020
Bien expliqué , Merci …
patbig04Publié le 6:04 - Avr 17, 2020
Bien fonctionné
Merci
durendalPublié le 4:08 - Août 29, 2020
Pourriez vous ne pas utiliser cette aberration appelée “écriture inclusive” qui est une insulte à l’intelligence de la langue française.
Merci.
Stéphane PasquetPublié le 4:34 - Août 29, 2020
Personnellement, j’aime l’écriture inclusive, donc je vais continuer à l’utiliser.
User123Publié le 7:01 - Déc 10, 2020
ça ne marche pas, et je ne comprends pas du tout où entrer “python setyp.py build” ni si il faut installer cx-freeze à un moment, quand j’exécute le setup.py, j’ai une erreur me disant que le module est absent
Stéphane PasquetPublié le 7:13 - Déc 10, 2020
Il faut lire tout le texte car tout y est écrit.
” dans le terminal Windows, après s’être placé·e dans le dossier du fichier python principal, on tape:
python setyp.py build”
Il n’y a pas plus clair.
Et bien sûr, si dans le code Python, il y a un “import cx_Freeze”, il faut l’installer.
SalahPublié le 5:46 - Jan 7, 2021
Bien répondu mon Stéphouze !
GILBERTPublié le 2:06 - Jan 13, 2021
Bonjour
j’ai pu créé le dossier build et dist mais le programme ne se lance pas malgré tout. Il n’a pas d’interface graphique.
Stéphane PasquetPublié le 11:30 - Jan 14, 2021
Si l’exécutable ne se lance pas, c’est que vous n’avez pas sélectionner le bon. Il y a en effet deux exécutables créés. Si l’un ne se lance pas (par exemple celui du répertoire “build”) alors lancez celui du répertoire “dist” (je ne me souviens plus lequel il faut lancer car de mon côté, je supprime beaucoup de choses après avoir fait tout ça).