-
Génération d'un .exe
Bonjour,
J'ai créé un programme avec Python et j'aimerai bien le transformer en .exe.
J'ai regardé py2exe et cx_Freeze mais j'ai un problème:
Mon programme est découpé en plusieurs fichiers .py:
> Mon_programme.py
> Modules.py
> Classes.py
J'ai ensuite des dossiers avec des données utiles à mon programmes:
> Data
>> Dossier 1
>>> Fichiers images
>> Dossier 2
>>> Fichiers images
>> Fichiers images, sons, textes
> Annexe
>> Perso
>>> Fichiers textes
>> Fichiers textes
Toutes les données contenus dans Data servent juste à "l'esthétique" du programme. Dans Annexe, j'ai des fichiers textes contenant des infos et dans Annexe > Perso j'ai des fichiers texte que je peux générer depuis le programme.
Je ne comprend pas vraiment comment je doit indiquer au générateur de .exe le fait de prendre en compte les multiple .py (qui interagissent ensembles) et mes dossiers et fichiers utiles au bon fonctionnement.
Je ne sais pas non plus si la génération de fichier textes au sein d'un des dossier sera toujours possible (je pense que oui).
J'utilise également la bibliothèque pygame en plus de certaine bibliothèque standard.
Voilà, si quelqu'un pourrais donc m'indiquer comment utiliser py2exe ou cx_Freeze (au choix :mrgreen: ) ce serais gentil !
-
Bonjour,
En ce qui me concerne, j'utilise cx_freeze, et j'en suis très satisfait, y compris pour des programmes complexes: plusieurs exe, du graphique (PyQt4), de nombreux modules et packages, etc... De plus, cx_freeze existe pour Python 3.x, est régulièrement mis à jour (dernière version: 23/11/2012) et fonctionne en multiplateforme (Windows/Linux/MacOSX).
On trouve cx_freeze ici: http://cx-freeze.sourceforge.net/. On accède facilement à la doc, et si nécessaire au "mailing-list". Sous Linux, il est assez facile de compiler les sources pour avoir une version plus récente que celle proposée en paquet.
Dans les différentes méthodes pour utiliser cx_freeze, j'utilise "setup.py". J'ai un modèle de setup que je complète au fur et à mesure de mon expérience. J'ai fait un tuto sur le sujet: http://python.jpvweb.com/mesrecettes..._pyqt4_windows. Je viens de le mettre à jour.
Cependant, mon expérience du sujet me dit qu'il faut commencer par structurer le programme:
- identifier le ou les ".exe"
- identifier tous les modules et packages spécifiques au programme car il faudra dire à à cx_freeze comment les trouver
- identifier les ressources: les données nécessaires au fonctionnement du programme. Par exemple, l'icone ou les fichiers d'aide. Car il faudra dire à cx_freeze de les recopier
- séparer nettement le programme et les données sur lesquelles le programme travaille. En effet, les OS actuels n'acceptent pas qu'un programme modifie les données à l'endroit où il est installé, et même si c'est possible, ce n'est pas une bonne pratique sur le plan sécurité. Donc, sauf exception (p. ex. clé USB): le programme va où vont les programmes (par exemple: C:\Programmes\monprogramme), et les données de travail vont dans le home de l'utilisateur, ou dans une zone publique. Si le programme ".exe" est traité par un installeur comme innosetup, il sera installé par Windows avec les autres programmes.
- quand le programme doit conserver des paramètres d'une session à l'autre, il est pratique (et multiplateforme) de créer un répertoire de type ".monprogramme" dans le home de l'utilisateur. On trouve le home de l'utilisateur avec: os.path.expanduser('~').
Quand on a fait tout ça, il faut bien reconnaitre qu'il y a la place pour le tâtonnement: on lance le traitement par cx_freeze en console, on examine les centaines de lignes affichées, et on ajuste le setup en conséquence. Il n'est d'ailleurs pas toujours nécessaire de tout corriger pour que ça marche!
La méthode parait un peu compliquée au départ, mais avec la pratique, on va de plus en plus vite à l'adapter à un nouveau programme, et ça marche vraiment très bien!
A titre d'exemple, pour un concours photo, j'ai un programme graphique (PyQt4) de saisie de bordereaux en exe qui est placé avec sa base de données SQL sur des clés USB . L'utilisateur à qui j'ai donné une clé fait de la saisie chez lui sur son PC Windows personnel sans rien installer (il n'a ni Python, ni PyQt4): il se contente de lancer l'exe sur la clé. La saisie met à jour la base de données sur la clé. Et à la fin de la saisie, il fait une sauvegarde internet de la base de données sur mon serveur FTP, et je récupère le résultat chez moi, sans me déplacer!
-
Merci de ta réponse.
Je suis dans le cas (qui me semble être particulier) de Pygame.
J'ai trouvé le setup.py pour Py2exe donné sur le site de Pygame.
Mon programme consistant juste en un petit jeu je laisse les dossier de données et de sauvegardes avec le .exe du jeu (on verra plus tard pour le système de sauvegarde chez l'utilisateur :mrgreen: ).
Avec le setur.py que j'ai récupéré j'ai réussi à passer mon programme en .exe.
Py2exe me rassemble automatiquement les différents .py constituant le programme.
J'ai eu cependant des erreurs lorsque j'ai lancé la transformation en .exe, notamment ce message: Fatal Python error: (pygame parachute) Segmentation Fault.
J'ai trouvé la solution (après un bon moment de recherche):
Il ne faut pas spécifier d’icône dans le setup.py donné par Pygame.
Donc voilà, problème résolu, merci à vous.