Comment créer des éxécutables pour windows à partir de sources python avec Wine

Contact

Florent Manens
Français  English
Afin de construire facilement une version Linux et une version Windows de mes créations en Python et wxPython, j'ai expérimenté la mise en place de la création d'éxécutables pour Windows depuis Linux.
  1. Objectif
  2. Prérequis
  3. Procédure
    1. Installer wine
    2. Installation de python, wxpython
    3. Configuration de Wine
      1. Version = winxp
      2. shell32.dll
    4. Utilisation de Python
    5. Installation de McMillan's Python Installer
      1. Installation
      2. Configuration
      3. Utilisation
    6. Inno Setup
      1. Installation
      2. Compilation
  4. Conclusion
  5. Licence
  6. Authors
  7. Changelog

Objectif

Construire un environement de création d'éxécutable windows (installeur compris) depuis Linux

Prérequis

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

Procédure

Installer wine

urpmi wine
devrais faire l'affaire avec Mandrake 10.
Consultez la documentation pour d'autres distributions, je n'ai pas testé le résultat avec une version différente de wine-20040213-3mdk.

Installation de python, wxpython

Les différentes installations devaient se dérouler sans poser de soucis, utilisez simpement wine avec :
wine nomdusetup.exe
et suivez les indications

Configuration de Wine

Reportez vous à la documentation de wine pour la configuration générale

Version = winxp

Pour la configuration de Wine, j'ai du préciser :
[Version]
"Windows" = "winxp"

Si j'utilise une autre valeur ici, python ne veut pas se lancer.

shell32.dll

Si vous lancez python sans installer le shell32.dll vous aurez ceci :
$ /usr/bin/wine /var/lib/wine/Python23/python.exe
err:module:import_dll Loading module (file) SHELL32.dll (which is
needed by L"C:\\windows\\system\\python23.dll") failed (error
c0000020).
err:module:import_dll No implementation for SHELL32.dll.ShellExecuteA
imported from L"C:\\windows\\system\\python23.dll", setting to
0xdeadbeef
Commencez donc par installer la dll dans votre installation wine dans le répertoire correspondant à :
c:\windows\system32\ (c: est défini dans ~/.wine/config)
Pour la configuration du choix des dll (dans ~/.wine/config), j'ai utilisé la configuration de base de Mandrake :
[DllOverrides]
"oleaut32" = "builtin, native"
"ole32" = "builtin, native"
"comdlg32" = "builtin, native"
"shell32" = "builtin, native"
"shfolder" = "builtin, native"
"shlwapi" = "builtin, native"
"shdocvw" = "builtin, native"
"advapi32" = "builtin, native"
"msvcrt" = "native, builtin"
"mciavi.drv" = "native, builtin"
"mcianim.drv" = "native, builtin"
"msi" = "native, builtin"
"riched32" = "native, builtin"
"stdole.tlb" = "native, builtin"
"stdole2.tlb" = "native, builtin"
"stdole32.tlb" = "native, builtin"
"MFC42" = "native, builtin"
"*" = "builtin, native"

Utilisation de Python

Arrivé à cette étape, je dois être capable de lancer python avec wine :
$ /usr/bin/wine /var/lib/wine/Python23/python.exe
fixme:console:SetConsoleCtrlHandler (0x77c331db,1) - no
error checking
or testing yet
Python 2.3.4 (#53, May 25 2004, 21:17:02) [MSC v.1200 32 bit (Intel)]
on win32
Type "help", "copyright", "credits" or "license" for more information.
>>>

pour executer un programme python, n'oubliez pas les -- pour séparer les paramètres wine des paramètres python :
/usr/bin/wine /var/lib/wine/Python23/python.exe -- foobar.py

Installation de McMillan's Python Installer

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 :
python Configure.py
ce qui donne :
fixme:console:SetConsoleCtrlHandler (0x77c331db,1) - no error checking 
or testing yet
fixme:console:SetConsoleCtrlHandler (0x1e081940,1) - no error checking
or testing yet
I: computing EXE_dependencies
err:module:import_dll No implementation for
ADVAPI32.dll.GetEffectiveRightsFromAclW imported from
L"C:\\windows\\system\\pywintypes23.dll", setting to 0xdeadbeef
err:module:import_dll No implementation for
ADVAPI32.dll.GetAuditedPermissionsFromAclW imported from
L"C:\\windows\\system\\pywintypes23.dll", setting to 0xdeadbeef
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...
Configure.py:113: DeprecationWarning: Non-ASCII character '\x92' in
file E:\PROJETS\PACK~ZH3\OOOPM\OOOPM\INST~4Z2\versionInfo.py on line
171, but no encoding declared; see
http://www.python.org/peps/pep-0263.html for details
  import win32api, icon, versionInfo
fixme:resource:BeginUpdateResourceA ("H:\\me_test_exe.tmp",0): stub
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...

On peut constater plusieurs choses :

Utilisation

Création du fichier spec :
/usr/bin/wine /var/lib/wine/Python23/python.exe Installer/Makespec.py monscript.py
Préférez l'utilisation d'un éditeur de texte pour le fichier spec à la surcharge de la ligne de commande.
Note :
--onefile ne fonctionne pas
--icon ne fonctionne pas (pas d'icone dans l'exe)

Création de l'éxécutable avec :
/usr/bin/wine /var/lib/wine/Python23/python.exe Installer/Build.py monscript.spec

Inno Setup

Installation

Installez inno avec wine. J'ai pu utiliser inno avec mon fichier iss en plaçant inno dans un sous répertoire du répertoire racine du projet.

Compilation

Pour compiler sans utiliser l'interface graphique, utilisez :
wine Inno/ISCC.exe -- setup.iss

un fichier setup.exe est crée dans le répertoire Output/.

Je n'ai pas trouvé de solution permettant d'utiliser les exe créés avec McMillan's Python Installer (depuis GNU/Linux), cette fois ci, windows est nécessaire pour tester.

Conclusion

J'espère que cette "documentation" (prise de notes) sera utile à quelqu'un un jour.

Licence

GPL

Authors

Florent Manens
Translated to English by Stefaan Verscheure and Brian van den Broek

Changelog

jui 19 2004:
    * translated to English thanks to the help of Stefaan Verscheure and Brian
van den Broek
    * corrected sentence with no sens
jui 18  2004:
    * initial revision

Valid HTML 4.01!Document made with Nvu