FAQ Python
FAQ PythonConsultez toutes les FAQ
Nombre d'auteurs : 11, nombre de questions : 188, dernière mise à jour : 14 juin 2021
- Qu'est-ce que Py2exe ?
- Comment créer un fichier .exe à partir du fichier .py ?
- Comment masquer la fenêtre DOS si on a créé une application graphique ?
- Comment intégrer le fichier library.zip dans l'exécutable ?
- Comment déployer une application Tix avec Py2exe ?
- Comment déployer une application Pmw avec Py2exe ?
La bibliothèque py2exe permet de générer sous Windows des éxécutables à partir
d'un source Python. En plus, il y aura au minimum une dll Python et un zip contenant
les modules compilés que vous devrez fournir avec votre programme.
Il vous permettra également de créer toute une distribution
où vous pourrez empaqueter tous les fichiers nécessaires pour que votre programme
fonctionne correctement
Pour créer un fichier .exe à partir d'un fichier .py, il suffit d'écrire un petit
setup.py que l'on appelera ensuite avec l'argument py2exe
exemple:
Voici un code en mode console minimaliste
raw_input(
"test minimal de py2exe"
)
Dans le fichier setup.py, il faudra toujours faire les 2 importations et appeler la fonction setup avec des arguments qui varieront en fonction du programme à "compiler". Dans notre cas, nous avons un unique fichier .py exécuté en mode console. Si notre fichier a une interface graphique (développé sous Tkinter, wxPython, ...), il faudra remplacer le terme console par windows
from
distutils.core import
setup
import
py2exe
setup
(
console=
["testpy2exe.py"
])
Il suffit ensuite d'exécuter, dans une fenêtre DOS (et non une console Python), la commande suivante qui crééra une distribution.
c:/python25/python.exe setup.py py2exe
2 répertoires sont créés: dist et build - ce dernier ne sert que lors de la construction
de la distribution et peut donc être effacé
Dans le répertoire dist, vous récupérerez les fichiers:
fichiers générés | remarque |
---|---|
w9xpopen.exe | nécessaire pour une exécution sous win 9x |
unicodedata.pyd | |
python25.dll | moteur Python |
MSVCR71.dll | |
library.zip | ce zip contient les modules compilés |
bz2.pyd | |
test2pyexe.exe | exécutable de l'application |
unicodedata.pyd |
Tous ces fichiers ne sont pas forcément utiles. Cela dépendra du contenu de votre fichier .py
Dans notre cas, seuls Python25.dll, library.zip et test2pyexe.exe
nous sont utiles.
Si vous utilisez d'autres bibliothèques, visitez le lien suivant si vous rencontrez des difficultés:
http://starship.python.net/crew/theller/moin.cgi/Py2Exe
Si vous utilisez une application graphique (développée par exemple avec Tkinter, wxPython, ...), vous n'aurez donc sûrement pas besoin de
visualiser que ce soit sur la fenêtre DOS qui s'ouvre d'habitude automatiquement lors de l'exécution d'un fichier .py. Il vous suffit alors d'utiliser
l'option windows à la place de l'option console dans le fichier setup.py de compilation.
Voici un exemple sur une application Tkinter.
import
Tkinter as
Tk
import
sys
root =
Tk.Tk
(
)
btn =
Tk.Button
(
root, text =
'Quitter'
, command =
sys.exit)
btn.pack
(
)
root.mainloop
(
)
from
distutils.core import
setup
import
py2exe
setup
(
windows=
["test.py"
])
Pour intégrer le fichier library.zip directement dans l'exécutable, il suffit de rajouter dans le setup l'option zipfile = None
raw_input(
"test minimal de py2exe"
)
from
distutils.core import
setup
import
py2exe
setup
(
zipfile =
None
,
console=
["testpy2exe.py"
])
Pour le déploiement d'applications contenant certains modules (notamment les modules externes), il est parfois nécessaire
d'ajouter manuellement les fichiers nécessaires au bon fonctionnement de la bilbiothèque en question. C'est le cas pour Tix
où il est nécessaire d'inclure le répertoire <Path Python>/tcl/Tix8.4 ainsi que la dll tix84.dll du répertoire <Path Python>/Dlls.
Voici un exemple minimaliste d'un programme Python utlisant Tix
import
Tix
root =
Tix.Tk
(
)
root.mainloop
(
)
Dans le fichier setup.py, on liste l'ensemble des fichiers requis pour le bon fonctionnement de Tix que l'on insère dans le setup de py2exe par le paramètre data_files contenant une liste de tuples (répertoire de destination relatif au répertoire d'exécution du programme, liste des fichiers à copier dans ce répertoire). Attention, c'est exemple a été testé avec Python 2.5.2, Py2exe 0.6.8 et Tix 8.4.0. Si vous utilisez d'autres versions, il sera peut-être nécessaire de faire des ajustements dans les fichiers à insérer.
import
sys
import
os
import
glob
import
os.path
from
distutils.core import
setup
import
py2exe
def
listdirectory
(
path):
return
filter(
os.path.isfile, glob.glob
(
path +
os.sep +
'*'
))
data_files=
[
(
'Dlls'
, glob.glob
(
sys.prefix+
'/DLLs/tix84.dll'
)),
(
'tcl/tix8.4'
, listdirectory
(
sys.prefix+
'/tcl/tix8.4'
)),
(
'tcl/tix8.4/bitmaps'
, listdirectory
(
sys.prefix+
'/tcl/tix8.4/bitmaps'
)),
(
'tcl/tix8.4/pref'
, listdirectory
(
sys.prefix+
'/tcl/tix8.4/pref'
)),
]
setup
(
script_args =
['py2exe'
],
data_files =
data_files,
windows =
['test.py'
])
Le déploiement d'une application dépendante de Pmw nécessite une intervention du programmeur. Dans le répertoire d'installation de Pmw,
il existe cependant un fichier bundlepmw.py qui va nous faciliter cette tâche. L'exécution de ce fichier permet de concaténer
l'ensemble des fichiers de Pmw dans un unique fichier Pmw.py. Il vous faudra aussi rajouter les 2 fichier PmwColor.py et PmwBlt.py
Voici un exemple minimaliste d'une application Pmw:
import
Pmw
root =
Pmw.initialise
(
)
root.mainloop
(
)
Dans le fichier setup.py, nous allons tout d'abord modifier le fichier bundlepmw.py qui importe le module regsub qui n'existe plus
à partir de la version 2.5 de Python (donc si vous travaillez avec une version plus ancienne, vous n'avez pas à faire cette manipulation).
Ensuite, nous exécutons ce fichier qui créera un fichier Pmw.py contenant tous les fichiers internes à Pmw. Nous copions
enfin les fichiers PmwBlt.py et PmwColor.py.
Attention, c'est exemple a été testé avec Python 2.5.2, Py2exe 0.6.8 et Pmw 1.3.2. Si vous utilisez d'autres versions, il sera peut-être nécessaire de faire des ajustements dans les fichiers à insérer.
Le fichier setup correspondant:
from
distutils.core import
setup
import
py2exe
import
os
import
sys
import
subprocess
import
shutil
## si le fichier bundlepmw.py contient l'importation regsub (qui n'existe plus depuis la version 2.5 de Python)
## Vous pouvez sinon le faire à la main en remplaçant "regsub" par "re" et "gsub" par "sub"
fp =
open(
sys.prefix +
os.sep +
"Lib/site-packages/Pmw/Pmw_1_3/bin/bundlepmw.py"
)
a =
fp.read
(
).replace
(
"regsub"
, "re"
).replace
(
"gsub"
, "sub"
)
fp.close
(
)
ft =
open(
sys.prefix +
os.sep +
"Lib/site-packages/Pmw/Pmw_1_3/bin/bundlepmw.py"
, "w"
)
ft.write
(
a)
ft.close
(
)
## Création du fichier Pmw.py dans le répertoire courant
subprocess.call
(
[sys.executable, sys.prefix +
os.sep +
"Lib/site-packages/Pmw/Pmw_1_3/bin/bundlepmw.py"
,
sys.prefix +
os.sep +
"Lib/site-packages/Pmw/Pmw_1_3/lib"
])
## On copie les 2 fichiers PmwBlt.py et PmwColor.py dans le répertoire courant
shutil.copyfile
(
sys.prefix +
os.sep +
"Lib/site-packages/Pmw/Pmw_1_3/lib/PmwBlt.py"
, "PmwBlt.py"
)
shutil.copyfile
(
sys.prefix +
os.sep +
"Lib/site-packages/Pmw/Pmw_1_3/lib/PmwColor.py"
, "PmwColor.py"
)
setup
(
windows =
['test.py'
])