Outils pour utilisateurs

Outils du site


windows_py2exe

Sous Windows: distribuer un ".exe" avec py2exe

Distribuer une application Python pour Windows sous forme de fichier .py, c'est obliger l'utilisateur à installer Python sur son ordinateur.

La solution py2exe permet aux utilisateurs sous Windows d'exécuter l'application sous forme de fichier .exe sans avoir installé Python.

Site de référence de py2exe: http://www.py2exe.org/

Installation de py2exe

On télécharge la bonne version, celle qui correspond à la version Python qu'on a.

Par exemple pour la version Python 2.5:

py2exe-0.6.6.win32-py2.5.exe

L'installation ne pose aucun problème.

Solution "basique"

Dans le répertoire de l'application “application.py” dont on veut obtenir un exécutable .exe, on crée un fichier “setup.py” contenant:

from distutils.core import setup
import py2exe
 
setup(console=['application.py'])

Ceci pour fabriquer une application en console.

Pour une application graphique, il faut simplement remplacer “console=” par “windows=”:

from distutils.core import setup
import py2exe
 
setup(windows=['application.py'])

Une fois ce fichier setup.py créé, on fait apparaitre une console DOS (démarrer → exécuter → “cmd”).

Dans cette console dos, on va dans le répertoire de l'application .py à traiter par py2exe:

cd \chemin

et on fait:

python setup.py py2exe

Ou, si on veut ajouter une fonction d'optimisation (c'est ce que j'utilise):

python -O setup.py py2exe

Selon l'installation de votre Python, peut-être devez-vous le lancer avec son chemin c:\Python25\python.exe.

L'application distribuable se retrouve entièrement dans le répertoire “dist” créé par py2exe, et l'exécutable est application.exe. Le 2ème répertoire créé par py2exe, build, ne sert plus et peut être détruit. Vous pouvez, bien sûr, renommer le répertoire “dist” pour lui donner le nom de votre application.

Vous n'avez plus qu'à transmettre le contenu du répertoire “dist” sous forme d'un fichier archive zip avec les sous-répertoires.

Pour l'installation sur un autre PC (qu'il ait déjà ou non l'interpréteur Python): il n'y a rien d'autre à faire que de:

  • Désarchiver l'archive zip.
  • Copier l'arborescence dans un répertoire. Le chemin de ce répertoire ne doit contenir ni espace ni caractère accentué (donc, ni dans “c:\Program Files”, ni dans “Mes documents”, ni dans “c:\Documents and Settings”). Par exemple: c:\calculatrice.
  • Créer un raccourci sur le bureau par la méthode habituelle pour lancer l'application dans sa version exe. Selon le programme, vous pouvez préciser un répertoire de travail en plus du chemin de lancement de l'application elle-même.
  • NB: de ce fait, il n'y a rien d'inscrit dans le registre de Windows.

Dernier point: pour appliquer py2exe sur un très gros programme, on peut accélérer la création de l'exe avec psyco en appelant psyco au début de setup.py. Voir http://python.jpvweb.com/mesrecettespython/psyco. Bien entendu, l'appel de psyco dans le setup.py n'accélèrera que py2exe et pas le programme.

Solution plus élaborée

En utilisant plus d'options, cela donne pour une application graphique, le fichier setup.py suivant (c'est ce que j'utilise pour ma Calculext):

#!/usr/bin/python
# -*- coding: utf-8 -*-
 
from distutils.core import setup
import py2exe 
 
setup(
    name="Calculext",
    version="1.40",
    description="Une calculatrice scientifique extensible",
    author="Tyrtamos",
    license="license GPL v3.0",
    url="http://python.jpvweb.com",
    zipfile=None,
    windows = [{
            "script": "calculext.py",
            "icon_resources": [(0, "icone.ico")]
              }]
)

Tout le reste est pareil que pour la version basique.

Attention: s'il y a une icône, ne pas oublier de la copier dans le répertoire de l'exe (=dist). Pour cela, vous pouvez utiliser l'une de ces 2 méthodes:

  • copier “à la main” dans dist après le traitement py2exe
  • ajouter une instruction de copie dans le setup.py

Pour ajouter une instruction de copie dans le setup, par exemple pour ajouter les 2 fichiers “icone.ico” et “manuel.html”:

...
...
setup(
    ...
    windows = [{
            "script": "calculext.py",
            "icon_resources": [(0, "icone.ico")]
              }],  # n'oubliez pas la virgule!
    data_files=[("",["icone.ico","manuel.html"])]
)

le premier “” de data_files veut dire que la copie sera faite dans le répertoire dist. Vous pouvez désigner un sous-répertoire, par exemple pour mettre le manuel dans dist/docs:

    ...
    data_files=[("docs",["manuel.html"])]
    ...

En ce qui concerne la fabrication de l'icône, j'utilise sous Windows le programme gratuit LiquidIcon (http://www.x2studios.com/index.php?page=products&id=11)

Dans le cas où il y a des problèmes d'encodage, j'utilise l'astuce suivante. Je place dans le programme principal .py ce qui suit:

import sys
 
reload(sys)
if hasattr(sys,"setdefaultencoding"):
    sys.setdefaultencoding("utf-8")

Cela permet d'obliger l'interpréteur python à fonctionner avec l'encodage défini (ici, utf-8).

Pour tenir compte de py2exe dans le code

Lancer un même programme en .py ou en .exe peut générer quelques différences dans le code du programme lui-même.

Voilà des exemples que j'utilise, inspirés du site de py2exe:

  • Fonction est_exe() : renvoie True si le programme tourne sous py2exe, et False sinon.
  • Fonction rep_exec() : renvoie en tant que chaîne de caractère le répertoire du programme qui s'exécute.
import sys
import os
import imp
 
def est_exe():
    """permet de savoir si l'exécution est en exe avec py2exe (Windows) ou en .py avec l'interpréteur Python"""
    return (hasattr(sys, "frozen") or # nouveau py2exe
        hasattr(sys, "importers") or # ancien py2exe
        imp.is_frozen("__main__")) # tools/freeze
 
def rep_exec():
    """donne le répertoire d'exécution du programme"""
    if est_exe():
        # exécution .exe sous Windows avec py2exe
        return os.path.dirname(sys.executable)
    # exécution .py avec l'interpréteur Python
    return os.path.dirname(sys.argv[0])

Exemple d'utilisation:

Afficher une page html (par exemple manuel.html) placée dans le répertoire du programme qui s'exécute.

Dans tous les cas (en .exe ou en .py, sous Windows ou sous Linux), la page sera trouvée et affichée dans le navigateur web par défaut:

import os
import webbrowser
 
chemin = rep_exec() + os.sep + 'manuel.html'
webbrowser.open(chemin)


Amusez-vous bien!

windows_py2exe.txt · Dernière modification: 2008/07/09 07:00 par tyrtamos

Outils de la page