Ceci est l'ensemble de mes notes, rassemblées durant mes recherches pour reussir à faire fonctionner cx_freeze, avec du code PYTHON, pour windows, exclusivement.
J'espère qu'elles pourront servir à un certains nombres de personnes en difficulté avec ce logiciel. J'invite tous les membres récupérant des informations non citées ici à venir compléter/corriger ce post.
Les sites utiles sont:
>CX_FREEZE: http://cx-freeze.sourceforge.net/
>DISTUTILS: http://docs.python.org/2/library/distutils.html
Introduction
Cx_freeze est une surcouche à disutils, simplifiant un peu (beaucoup) l'utilisation de cet outil afin de créer des executables PYTHON
On peut définir un certains nombres de paramètres permettant de personnaliser plus ou moins l'executable de sortie.
Il est possible d'indiquer plusieurs fichier python en entrée en tant qu'exécutable, mais dans ce cas précis, cela génèrera plusieurs .exe. Chacun de ses .exe sera independant: il s'exécutera dans sa propre instance de l'interprêteur PYTHON.
Pour ne pas rencontrer ce soucis, il faut définir un .py comme exécutable seul, lequel gèrera l'ensemble des autres .py et ressources.
Meilleure structure PJ adaptée à cx_freeze
La structure du projet m'a donné quelques difficultés. Après de nombreux essais, il est apparus que les fichiers python devaient se situés à la racine du dossier projet pour ne pas poser probleme. L'icone pour le logiciel, au format ico (imposer par cx_freeze) doit également se trouver à la racine, de même que les packages.
Les fichiers en sus (images, musiques, videos, BDD, ...) peuvent eux se trouver à la racine, ou ranger dans des dossiers. Si nous resumons la structure de base donc:
<Dossier PJ>
--*.py
--*.ico
--packages
--dossiers fichiers en sus ou fichiers eux même
Cette structure sera celle considérée pour la suite.
Chemin d'exécution
Un des soucis que j'ai rencontré lors de mes essais, est le chemin d'exécution. En effet, j'utilisasis des commandes classique avec os et sys. Il s'avère que cela change un peu lorsque le code PYTHON est compilé pour windows, tel qu'indiqué dans la FAQ de CX_FREEZE. Pour y palier, j'ai créé un module que j'utilise dans tous mes projet, et qui me sert de chemin de base pour accéder aux ressources logicielles.
Code : Sélectionner tout - Visualiser dans une fenêtre à part
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39 #!/usr/bin/env python #-*- coding:utf-8 -* import os import sys #===================================================# # Obtention du bon chemin d'execution # #===================================================# def cxf_get_path(): """ Allow to know the good path under Linux, MAC, and Windows. Under Windows, adapt the path betwwen direct execution or trough cx_freeze or PYXMAKER PARAMETERS ========== None RETURNS ======= The execution path, adapted to the situation """ #OS = Linux if sys.platform == 'linux2': path = os.path.dirname(os.path.abspath(__file__)) #OS = Windows elif sys.platform in ("win32", "cygwin"): if getattr(sys, 'frozen', False): path = os.path.dirname(sys.executable) else: path = os.path.dirname(os.path.abspath(__file__)) #OS = MAC else: path = os.path.dirname(os.path.abspath(__file__)) return path
Comme on peut le voir ici, ce code me permet de m'adapter à l'OS, et dans le cas de windows, de récupérer le chemin correct, que j'exécute directement le code PYTHON, ou que je le compile en exécutable. Ainsi je n'ai jamais à remodifier mon code, fonction de ce que je fais derrière.
Paramètres
La documentation de cx_freeze est assez restreintes, mais une fois que l'on sais que se cache derrière en réalité distutils, alors on peut trouver l'ensemble des informations désirées dans la documentation de ce dernier outil.
Parmis les nombreux paramètres possibles, les principaux sont:
>Pour le projet:
>>includes: permet de préciser les modules à inclure, il s'agit d'une liste
>>excludes: permet de préciser les modules à exclure. il s'agit d'une liste
>>packages: permet de préciser les packages persos à inclures. C'est une liste
>>include_files: permet de préciser les fichiers/dossier à inclures. C'est une liste. Fonctionne de manière récursive. Si un dossier est indiqué, tous les fichiers et sous-dossiers contenus seront inclus.
>>base: si à None, indique que le code PYTHON s'exécute en mode console. Si à Win32GUI, indique un mode fenetre. Le mauvais paramètre peut entrainer des message d'erreur à l'exécution.
>Pour l'exécutable:
>>name: Nom du logiciel/package
>>version: La version
>>author: auteur(s) du logiciel/package
>>author_email: mail de/des (l') auteur(s)
>>maintainer: le nom du mainteneur
>>maintainer_email: le mail du mainteneur
>>url: la homepage du logiciel/package
>>description: une description courte (une phrase, moins de 200 caractères)
>>long_description: une description longue (au format reStructuredText)
>>download_url: l'url de telechargement du package/logiciel
>>license: la licence utilisée
>>icon: l'icone qui servira pour le logiciel sous windows exlusivement. Remplace une icone definit dans l'IHM. Cette icone doit se trouver au même niveau que les fichiers python
Script type
Le script ci-dessous est type et vous permettra je l'espère, combiné aux explications ci-dessus, de vous en sortir. Il s'agit du script type que j'utilise dans mon logiciel PYXMAKER. A noter que $$ICON$$ et $$ICON_EXEC$$ contiennent la même information.
Voir aussi les Cours et tutoriels pour apprendre la programmation Python
Code : Sélectionner tout - Visualiser dans une fenêtre à part
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71 #!/usr/bin/python # -*- coding: utf-8 -*- #script cx_freeze for pyxamker software import sys, os from cx_Freeze import setup, Executable ######################################################################### # OPTIONS PREPARATION # ######################################################################### path = sys.path.append(os.path.join(".", os.path.dirname(sys.executable))) includes = [$$INCLUDES$$] excludes = [$$EXCLUDES$$] packages = [$$PACKAGES$$] include_files = [$$INCLUDE_FILES$$] options = {"path": path, "includes": includes, "excludes": excludes, "packages": packages, "include_files": include_files, "create_shared_zip": False, "append_script_to_exe": True, "include_in_shared_zip": False, "include_msvcr": True, } ######################################################################### # TARGET PREPARATION # ######################################################################### base = None if sys.platform == "win32" and $$WINCONS$$: base = "Win32GUI" cible_1 = Executable( script = "$$FICHIER_PY_EXEC$$", base = base, icon = "$$ICON_EXEC$$", compress = False ) ######################################################################### # SETUP PREPARATION # ######################################################################### setup( name = "$$NAME$$", version = "$$VERSION$$", description = "$$DESCRIPTION$$", author = "$$AUTHOR$$", author_email = "$$AUTHOR_MAIL$$", maintainer = "$$MAINTAINER$$", maintainer_email = "$$MAINTAINER_MAIL$$", url = "$$WEBSITE$$", options = {"build_exe": options}, icon = "$$ICON$$", executables = [cible_1] )
Partager