L’objectif est de distribuer le jeu sans que l’utilisateur n’ait à installer et configurer l’environnement python d’exécution et ses dépendances.

En pratique, il s’agit de trouver :

  • Une solution de freeze identique pour toutes les plateformes (même si on se limite à Windows et Linux dans cet exemple)
  • Idéalement complétée par une solution d’installation afin de rendre le processus encore plus simple et plus propre pour l’utilisateur.

Dans la liste d’outils évoquée dans la documentation python on exclue :

  • bbFreeze dont la dernière version date de 2014
  • py2exe pour la même raison et parce qu’il ne supporte que windows
  • py2app parce qu’il ne supporte que OSX

Pour le freeze de notre application nous avons le choix entre :

Auxquels j’ajoute une troisième option elle aussi « cross platform » et opensource :

Après de premiers essais j’ai également exclu pyInstaller car les exe qu’il produit sont identifiés par les antivirus comme des chevaux de Troie (avéré avec Norton, mentionné pour de nombreux autres antivirus).

Scripts associés aux exécutables:

Pour la création des exécutables, on copie les scripts du package labpyproject.apps.labpyrinthe à la racine du projet. Pour les résolutions d’url des ressources (images, fonts), on indique ce nouvel emplacement via la propriété frozen=true de la gui GUIPygame. Exemple avec le script standalonePygame.py:

#!/usr/bin/env python3
# -*- coding: utf-8 -*-
# imports
from labpyproject.apps.labpyrinthe.app.application import AppManager
from labpyproject.apps.labpyrinthe.gui.GUIPygame import GUIPygame

# script
if __name__ == "__main__":
    # 1. Création de la GUI graphique dans le thread principal
    GUIpg = GUIPygame(frozen=True)
    # 2. Création du composant applicatif paramétré en standalone
    AppMngr = AppManager(
        AppManager.APP_STANDALONE, interface=AppManager.INTERFACE_PYGAME
    )
    # 3. Lancement de la GUI (run thread)
    GUIpg.start_GUI()