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 !

fenêtre de exécutable windows à partir d’un programme python

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”.

inno setup installer python exécutable windows

Il y a ensuite quelques fenêtres qui vont s’afficher et il faudra compléter les champs proposés.

Cet article a 26 commentaires

  1. IBRAD

    Bien expliqué , Merci …

  2. patbig04

    Bien fonctionné
    Merci

  3. durendal

    Pourriez vous ne pas utiliser cette aberration appelée “écriture inclusive” qui est une insulte à l’intelligence de la langue française.
    Merci.

    1. Personnellement, j’aime l’écriture inclusive, donc je vais continuer à l’utiliser.

  4. User123

    ç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

  5. 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.

  6. Salah

    Bien répondu mon Stéphouze !

  7. GILBERT

    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.

  8. 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).

  9. Misan

    Bonjour,
    J’ai essayé et je crois que c’est reussi mais quand je change d’ordinnateur pour l’executer ca renvoie une erreur qui dit “il mnque api-ms-win-l1-O.dll sur votre ordinnateur
    Puis-je avoir vos aides, merci

    1. Si l’exécutable fonctionne sur un ordinateur et pas un autre, c’est que le problème vient du deuxième ordinateur. Le message est clair: il manque un fichier DLL de Windows et n’étant pas voyant, je ne sais pas pourquoi ce DLL est manquant. Une simple recherche Google vous en dira plus en tapant le nom du fichier DLL. Au mieux, il suffit de télécharger ce DLL quelque part, ou encore updater Windows.

  10. Misan

    Merci, je vais essayer

  11. Serna

    Bonjour.
    Je suis sur fedora 32 et j’ai essayé la méthode avec pyinstaller. Il me créer bien les deux dossiers dont “dist” mais dans le dossier le fichier chiffrement est sans extension. J’ai essayé sur un windows 10 virtuel (via gnome machine) mais ça ne fonctionne pas . Ma version de python est la 3.8.10.

    Je vais essayé sur un ordi avec windows 10. Cordialement et merci pour le tuto

    1. Cet article mentionne bien “sous windows”, et non sous Linux. Il est donc normal que tout ceci ne fonctionne pas. On ne peut pas créer d’exécutable sous Linux car ce format n’existe pas.

  12. Léa

    Bonjour,

    Merci pour vos explications, tout fonctionne à merveille
    Tout était clair et précis
    Seulement j’ai une question, est ce normal que je ne puisse utiliser mon executable qu’en local ?
    En effet, j’aimerai pouvoir le déplacer sur un réseau mais lorsque j’ai essayé l’application ne s’ouvrait plus
    Y a t-il un moyen de résoudre ce problème ?

    Merci d’avance

    Léa

    1. Il faut copier tous les fichiers, et non l’exécutable, y compris les dossiers du dossier “build” (de mémoire). Le seul fichier EXE appelle d’autres fichiers DLL etc. Il faut donc tout copier.

  13. Léa

    C’est ce que je fais, j’ai copié le dossier entier, aucun problème pour l’ouvrir sur clé USB ou disque dur externe mais impossible sur un réseau partagé

    1. Donc le problème viendrait du fait que c’est en réseau, mais je ne vois pas quelle en serait la raison, n’ayant jamais été confronté à ce genre de problème.
      Cela dit, j’imagine que quand on exécute un programme stocké sur un réseau, c’est la machine sur laquelle on lance le programme qui l’interprète et donc il faudrait que les fichiers nécessaires se trouve sur la dite machine. Je suis loin d’être un expert en réseau… mais ça me semblerait cohérent.

  14. Arno

    Bonjour, j’ai un pb avec bitdefender (antivirus) lorsque je lance la ligne de commande afin de créer mon “.exe”

    1. Bonjour. Je suis tenté de dire : “désactivez l’antivirus le temps de la manip'”. Perso, je n’utilise aucun antivirus, donc je ne peux pas vous aider… Je ne vois pas le problème, mais comme les antivirus sont des fois ultra (trop) protecteurs, il doit y avoir un processus bloqué lors de la manip.

  15. Arnaud

    Bonjour, j’ai continué la programmation de mon appli avant de m’y remettre. Mon exe à présent est bien créer mais lorsque je le lance, une fenêtre noire s’affiche et se referme aussitôt

    1. Si vous utilisez cx_Freeze, il faut utiliser l’option : executables = [ Executable(script = "pendu.py",icon = "pendu.ico", base = "Win32GUI" ) ] (si une fenêtre noire s’affiche, s’est que vous n’avez pas dû mettre la bonne base).

  16. sylvain thomassin

    merci beaucoup ,
    j’ai fait beaucoup d’essais avec pyinstaller sans succès le fichier .exe ne fonctionnais pas ,votre explication de cx_Freeze est clair nette est précise le fichier fonction sans accros

  17. Elie Laurent Raphaël Rakotoarisoa

    Avec pyinstaller, ça marche bien, sans encombre, à premier coup. Merci beaucoup !

  18. henri zaharia

    Bonjour
    pyinstaller essai.py s’est bien passé mais l’exécutable ne marche pas : après un input, fermeture de la fenêtre sans exécution.

    1. Si l’exe ne fonctionne pas, c’est qu’il manque un fichier dans le répertoire courant (l’icône par exemple).

Laisser un commentaire