Prérequis

La solution que j'ai mis en place se base sur les outils suivants :

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