Créer des éxécutables Python pour windows avec Wine
Par Florent Manens, dimanche 12 février 2006 à 18:29 :: Informatique :: #33 :: rss
Afin de construire facilement une version Linux et une version Windows de mes créations en Python, j'ai expérimenté la mise en place de la création d'éxécutables pour Windows depuis Linux.
Objectif
Mettre en place un environnement de création d'éxécutable windows depuis Linux.
Prérequis
La solution que j'ai mis en place se base sur les outils suivants :
- Wine (wine-9.6)
- Python 2.3 pour windows (l'installation du MSI de python 2.4 me pose quelques problèmes)
- PyInstaller (anciennement Gordon McMillan's Python Installer)
- Pywin32
Procédure
Installer wine
Ce que j'ai testé ne fonctionne pas avec la version d'origine de wine sur mandriva 2006. J'ai donc installé la version 9.6 provenant du site Wine.
urpmi wine-0.9.6-1.2006.SoS.rpm
La source SOS permet d'installer des RPMs à jour.
Consultez la documentation pour d'autres distributions, je n'ai pas testé le résultat avec une version différente de wine-9.6.
Configuration de Wine
Dans les versions actuelles, le fichiers "config" n'est plus utilisé, tout se trouve dans la base de registres. Configurez votre installation avec winecfg. En particulier la configuration des disques, sans laquelle vous ne pourrez pas continuer.
Installation de python
Les différentes installations devaient se dérouler sans poser de soucis, utilisez simpement wine avec : wine nomdusetup.exe et suivez les indications
wine Python-2.3.5.exe err:font:ReadFontDir Can't open directory "/home/manens/.wine/dosdevices/c:/windows/Fonts" err:ddeml:DdeConnect Done with INITIATE, but no Server window available err:ole:CoGetClassObject class {00021401-0000-0000-c000-000000000046} not registered fixme:ole:CoCreateInstance no classfactory created for CLSID {00021401-0000-0000-c000-000000000046}, hres is 0x80040154 err:ole:CoGetClassObject class {00021401-0000-0000-c000-000000000046} not registered fixme:ole:CoCreateInstance no classfactory created for CLSID {00021401-0000-0000-c000-000000000046}, hres is 0x80040154 err:ole:CoGetClassObject class {00021401-0000-0000-c000-000000000046} not registered fixme:ole:CoCreateInstance no classfactory created for CLSID {00021401-0000-0000-c000-000000000046}, hres is 0x80040154 err:ole:CoGetClassObject class {00021401-0000-0000-c000-000000000046} not registered fixme:ole:CoCreateInstance no classfactory created for CLSID {00021401-0000-0000-c000-000000000046}, hres is 0x80040154 err:ole:CoGetClassObject class {00021401-0000-0000-c000-000000000046} not registered fixme:ole:CoCreateInstance no classfactory created for CLSID {00021401-0000-0000-c000-000000000046}, hres is 0x80040154
Utilisation de Python
Arrivé à cette étape, je dois être capable de lancer python avec wine :
$ /usr/bin/wine /var/lib/wine/Python23/python.exe Python 2.3.5 (#62, Feb 8 2005, 16:23:02) MSC v.1200 32 bit (Intel) on win32 Type "help", "copyright", "credits" or "license" for more information. >>>
On peut utiliser un script pour lancer Python :
cat ~/bin/winpython #! /bin/bash /usr/bin/wine /home/manens/.wine/c_drive/Python23/python.exe -- $@
Dans la suite, je ferai référence à la commande winpython
Si vous avez cette erreur :
>>> import re Traceback (most recent call last): File " <stdin>", line 1, in ? File " C:\Python23\lib\re.py", line 5, in ? from sre import * File " C:\Python23\lib\sre.py", line 97, in ? import sre_compile File " C:\Python23\lib\sre_compile.py", line 13, in ? import _sre, sys ImportError: dynamic module does not define init function (init_sre)
Changez de version de Wine, J'ai résolu ce problème en passant à la version 9.6.
Installation de PyInstaller
Installation In suffit de décompresser l'installeur dans un sous dossier du répertoire racine de votre projet. Apparement, ça ne fonctionne pas si l'installeur se trouve dans un autre disque (configuration de wine) ou dans un répertoire. Configuration D'après la doc : winpython Configure.py ce qui donne :
winpython Configure.py I: computing EXE_dependencies I: Finding TCL/TK... I: found TCL/TK version 8.4 I: testing for Zlib... I: ... Zlib available I: Testing for ability to set icons, version resources... I: ... resource update unavailable - win32api.BeginUpdateResource failed I: Testing for Unicode support... I: ... Unicode available I: testing for UPX... I: ...exception result in testing for UPX Errno 2 No such file or directory: 'upx.txt' (2, 'No such file or directory') I: computing PYZ dependencies...
Je n'ai pas tenté d'utiliser UPX.
On peut constater plusieurs choses :
- TCL/TK = OK (pas testé)
- Zlib = OK (pas testé)
- "ability to set icons" = Pas OK On ne pourra pas placer d'icône dans l'éxécutable, pas très grave
- Unicode = OK (pas testé)
- UPX = Pas OK Bien que installé, upx n'est pas détecté. Il est toujours possible de l'utiliser indépendament. Remarque : L'installeur créé avec une compression lzma (dans Inno Setup par exemple) sera plus petit si vous n'utilisez pas upx.
Utilisation
Création du fichier spec :
winpython pyinstaller-snapshot/Makespec.py --onefile data2py.py wrote J:\Projets\data2py\data2py.spec
Préférez l'utilisation d'un éditeur de texte pour le fichier spec à la surcharge de la ligne de commande. Note : --onefile fonctionne --icon ne fonctionne pas (pas d'icone dans l'exe)
Création de l'éxécutable avec :
winpython pyinstaller-snapshot/Build.py data2py.spec checking Analysis building Analysis because out0.toc non existent running Analysis out0.toc Analyzing: pyinstaller-snapshot\support\_mountzlib.py Analyzing: pyinstaller-snapshot\support\useUnicode.py Analyzing: data2py.py W: Cannot determine your Windows or System directories W: Please add them to your PATH if .dlls are not found W: or install starship.python.net/skippy/win32/Downloads.html E: lib not found: python23.dll dependency of C:\Python23\DLLs\_sre.pyd E: lib not found: python23.dll dependency of C:\Python23\DLLs\zlib.pyd Warnings written to J:\Projets\data2py\warndata2py.txt checking PYZ rebuilding out1.toc because out1.pyz is missing building PYZ out1.toc checking PKG rebuilding out3.toc because out3.pkg is missing building PKG out3.pkg checking ELFEXE rebuilding out2.toc because data2py.exe missing building ELFEXE out2.toc
Et ... ça ne fonctionne pas. Pour que ça fonctionne, installez pywin32 :
wget http://ovh.dl.sourceforge.net/sourceforge/pywin32/pywin32-207.win32-py2.3.exe 100% ==================================================================================================> 4,152,478 109.28K/s ETA 00:00 13:45:12 (52.79 KB/s) - `pywin32-207.win32-py2.3.exe' saved 4152478/4152478
Puis :
wine pywin32-207.win32-py2.3.exe fixme:win:SetWindowTextW setting text L"Fermer" of other process window (nil) should not use SendMessage err:ole:CoGetClassObject class {0002e005-0000-0000-c000-000000000046} not registered err:ole:CoGetClassObject no class object {0002e005-0000-0000-c000-000000000046} could be created for for context 0x1 fixme:ole:CoCreateInstance no classfactory created for CLSID {0002e005-0000-0000-c000-000000000046}, hres is 0x80040154 err:ole:CoGetClassObject class {0002e005-0000-0000-c000-000000000046} not registered err:ole:CoGetClassObject no class object {0002e005-0000-0000-c000-000000000046} could be created for for context 0x1 fixme:ole:CoCreateInstance no classfactory created for CLSID {0002e005-0000-0000-c000-000000000046}, hres is 0x80040154
On devrait obtenir ceci :
pyinstaller-snapshot/Build.py data2py.spec checking Analysis building Analysis because out0.toc non existent running Analysis out0.toc Analyzing: pyinstaller-snapshot\support\_mountzlib.py Analyzing: pyinstaller-snapshot\support\useUnicode.py Analyzing: data2py.py Warnings written to J:\Projets\data2py\warndata2py.txt checking PYZ rebuilding out1.toc because out1.pyz is missing building PYZ out1.toc checking PKG rebuilding out3.toc because out3.pkg is missing building PKG out3.pkg checking ELFEXE rebuilding out2.toc because out2.toc missing or bad building ELFEXE out2.toc
Pour tester les exe créés avec PyInstaller (depuis GNU/Linux), il suffit de les lancer avec Wine. Dans certains cas, le fonctionnement sera limité à l'émulation offerte par Wine.
wine data2py.exe convert file into an importable module data2py.py toto.dat >toto.py extract from python : import toto f = file("toto.dat", "wb") f.write(toto.data.decode("base64"))
Conclusion
Bien que je sois un utilisateur convaincu de py2exe, je n'ai pas réussi à l'utiliser avec Wine. PyInstalleur est prométeur, la version à venir apporte de nouvelles fonctionnalités (par exemple, la suppression de la dépendance vers msvcr71.dll). Les fichiers sources sont en clair dans le .exe créé, ne pensez pas que le .exe soit obscure ça n'est pas le cas !
Continuer à coder sous Linux, un vrai plaisir non ?
A voir aussi : Les sources de data2py et la version originale
Commentaires
Aucun commentaire pour le moment.
Ajouter un commentaire
Les commentaires pour ce billet sont fermés.