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/
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.
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:
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.
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:
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).
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:
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!