Introduction
Même si la majorité des développeurs Python travaillent sur des environnements de développement Unix, il est parfois nécessaire de fournir une distribution d’une application Python sous le système d’exploitation Windows. Ce document constitue davantage une prise de notes qu’un tutoriel complet puisque je passe les éventuelles étapes d’installation de Cython, MinGW, Visual Studio ou Nuitka. J’utilise les versions 32 bits pour l’interpréteur Python 2.7, les packages Python et les compilateurs. J’utilise à la place de MinGW, la distribution TDM-GCC.
Ces méthodes ne servent pas à obfusquer votre code mais à distribuer l’interpréteur Python, les bibliothèques associées et votre application sous forme d’un paquet.
Sous Windows, pour développer, j’utilise
La distribution Python fournie par ActiveState.
Les paquets Python disponibles sur ce site pour Windows.
Microsoft Visual Studio Express 2008.
Microsoft Visual C++ 2008 Redistributable Package (x86).
Admettons que nous ayons une application Python sous cette forme
Un dossier principal nommé “supershape”.
Un fichier principal main.py résidant dans ce dossier et qui constitue l’application principale.
J’utilise ici une application développée avec l’outil Kivy.
Avec Pyinstaller
On initialise d’abord un fichier de spécifications
pyinstaller --name supershape supershape\main.py
On édite le fichier supershape.spec créé.
Pour un dossier regroupant l’exécutable et les dll, on édite le fichier comme suivant
# -*- mode: python -*-
from kivy.tools.packaging.pyinstaller_hooks import install_hooks
install_hooks(globals())
a = Analysis(['SuperShape\\main.py'],
pathex=['C:\\Users\\ANTEC\\Documents'],
hiddenimports=[],
runtime_hooks=None)
pyz = PYZ(a.pure)
exe = EXE(pyz,
a.scripts,
exclude_binaries=True,
name='supershape.exe',
debug=False,
strip=None,
upx=True,
console=False )
coll = COLLECT(exe, Tree('C:\\Users\\ANTEC\\Documents\\Supershape'),
a.binaries,
a.zipfiles,
a.datas,
strip=None,
upx=True,
name='supershape')
Pour un exécutable standalone qui regroupe l’interpréteur
# -*- mode: python -*-
from kivy.tools.packaging.pyinstaller_hooks import install_hooks
install_hooks(globals())
a = Analysis(['SuperShape\\main.py'],
pathex=['C:\\Users\\ANTEC\\Documents'],
hiddenimports=[],
runtime_hooks=None)
pyz = PYZ(a.pure)
exe = EXE(pyz, Tree('C:\\Users\\ANTEC\\Documents\\Supershape'),
a.scripts,
a.binaries,
a.zipfiles,
a.datas,
name='supershape.exe',
debug=False,
strip=None,
upx=True,
console=False )
Enfin on enveloppe le tout par la commande suivante
pyinstaller supershape.spec
Avec Nuikta
On génère la compilation en C++ avec la commande suivante
nuikta --recurse-all main.py
Avec Cython
On transforme le fichier Python en C
cython main.py -o supershape.c --embed
On compile le C avec Visual Studio et son compilateur
cl.exe /nologo /Ox /MD /W3 /GS- /DNDEBUG -Ic:\Python27\include -Ic:\Python27\PC /supershape.c /link /OUT:"supershape.exe" /SUBSYSTEM:CONSOLE /MACHINE:X86 /LIBPATH:c:\Python27\libs /LIBPATH:c:\Python27\PCbuild