Récits d'un GeekTrotter Carnet de bord binaire

1déc./110

Empaqueter un programme Python Qt (PySide) sous Windows (.exe)

C'est assez simple de créer des exécutables de programmes Python utilisant le framework de GUI Qt (PySide) sous Windows (et encore plus simple sous Linux avec cxfreeze).

Voyons deux façon de faire.

1. py2exe

Avantages

  • Facile
  • Supporte plusieurs exécutables

Désavantage

  • Oublie parfois des bibliothèques

Téléchargement

Site de Py2Exe
Il existe des exécutables pour 32 et 62 bits.

Configuration basique

basic_setup.py

from distutils.core import setup
import py2exe

setup(
    windows = ['pysideApp1.py','pysideApp2.py'],
    options = {
        "py2exe" : {
            "includes" : ['sys', 'tempfile', 'zipfile', 'mmap', 'encodings',
                          'json', 'hashlib', 'datetime', 'struct',
                          'os', 'time', 'random', 'math', 'xmlrpclib', 'Crypto']
        }
    }
)

Compiler

$ python basic_setup.py py2exe

Et c'est tout !
Admirez votre répertoire "dist" et vous devriez avoir votre application 😉

2. PyInstaller

Avantage

  • Semble mieux détecter les bibliothèques nécessaires

Désavantages

  • La dernière version stable à ce jour (1.5.1) ne supporte pas plusieurs fichiers exécutables
  • Requiert un peu plus de configuration

Téléchargement

Site de PyInstaller
Pas besoin d'installer, extrayez juste quelque part.

Configuration pour PySide

pyside.spec

import os

a = Analysis(
    [os.path.join(HOMEPATH,'support\\_mountzlib.py')
        , os.path.join(HOMEPATH,'support\\useUnicode.py')
        , os.path.normpath(os.path.join(currentDir, 'main.py'))
        , os.path.normpath(os.path.join(currentDir, 'importantLib.py'))
        # add the files you want PyInstaller to analyse the "import" statements
        # to detect the libraries to include
    ],
     pathex=['C:\\Python27\\pyinstaller-1.5.1']
)
pyz = PYZ(a.pure)
exe = EXE(pyz,
          a.scripts,
          exclude_binaries=1,
          name=os.path.join('build\\pyi.win32\\build_output', 'your_application.exe'),
          debug=False,
          strip=False,
          upx=True,
          console=False )
coll = COLLECT( exe,
               a.binaries,
               a.zipfiles,
               a.datas,
               strip=False,
               upx=True,
               name=os.path.join('dist', 'dist_output'))

Compile

Allez dans le dossier où vous avez extrait PyInstaller et lancez:
$ python pyinstaller.py "C:\chemin\vers\pyside.spec"

C'est tout !
Regardez votre répertoire "dist_output" et vous devriez avoir votre programme 😉

Postface

Les deux méthodes marchent bien.
Le dossier créé par PyInstaller est un peu plus gros (environ 10MB dans mon cas pour 8MB avec py2exe).
Cependant, il semble include plus de bibliothèques, alors que je n'ai manuellement spécifié aucune bibliothèque spéciale (alors que je l'avais fait pour py2exe).
Je n'ai spécifié que mes 2 fichiers .py principaux et il a trouvé toutes les bibliothèques nécessaires comme un grand, c'est donc peut-être plus fiable.