Outils pour utilisateurs

Outils du site


cx_freeze

Différences

Ci-dessous, les différences entre deux révisions de la page.

Lien vers cette vue comparative

Les deux révisions précédentes Révision précédente
Prochaine révision
Révision précédente
cx_freeze [2014/12/24 11:06]
tyrtamos [Objectif]
cx_freeze [2014/12/24 12:21]
tyrtamos
Ligne 1: Ligne 1:
 ====== Distribuer une application avec cx-freeze (multiplateforme) ====== ====== Distribuer une application avec cx-freeze (multiplateforme) ======
 +
 +[modif 24/12/2014]
  
 ===== Objectif ===== ===== Objectif =====
Ligne 12: Ligne 14:
 ===== Installation de cx_Freeze ===== ===== Installation de cx_Freeze =====
  
-Comme on voit sur la page des téléchargements,​ cx_Freeze existe pour la partie binaire pour chaque version de Python (2.5, 2.6, 2.7, 3.1)+Comme on voit sur la page des téléchargements,​ cx_Freeze existe pour la partie binaire pour chaque version de Python. A ce jour (12/2014)il existe pour Python ​2.7, 3.3 et 3.4
  
 Sous Windows, c'est facile: on télécharge sur le site de cx_Freeze et on installe la bonne version (celle qui correspond à la version du Python qu'on a!) comme n'​importe quel logiciel Windows. Sous Windows, c'est facile: on télécharge sur le site de cx_Freeze et on installe la bonne version (celle qui correspond à la version du Python qu'on a!) comme n'​importe quel logiciel Windows.
  
-Sous Linux, c'est un peu plus complexe. Il y a un paquet rpm pour centos, et les sources pour les autres. Cependant, il est très probable que cx_Freeze fasse déjà partie des logiciels disponibles pour votre distribution:​ prenez celle-là!+Sous Linux, c'est un peu plus complexe. Il y a un paquet rpm pour centos, et les sources ​(.tar.gz) ​pour les autres. Cependant, il est très probable que cx_Freeze fasse déjà partie des logiciels disponibles pour votre distribution:​ prenez celle-là!
  
 Sous Mac Os X, je ne sais pas, mais on en parle dans la mailing-list:​ [[http://​sourceforge.net/​mailarchive/​forum.php?​forum_name=cx-freeze-users]]  ​ Sous Mac Os X, je ne sais pas, mais on en parle dans la mailing-list:​ [[http://​sourceforge.net/​mailarchive/​forum.php?​forum_name=cx-freeze-users]]  ​
Ligne 22: Ligne 24:
 ===== Code proposé ===== ===== Code proposé =====
  
-Après plusieurs essais et consultation des quelques tutos d'​internet,​ j'​utilise la méthode avec setup.py, et voilà son contenu type.+J'​utilise ​depuis pas mal de temps déjà ​la méthode avec setup.py. En faitj'​utilise toujours le même setup.py que j'​améliore petit à petit au fur et à mesure de mes expériences
  
-Pour l'​exemple,​ j'ai dans un répertoire 2 fichiers 'test.py' et '​test2.py'​ que je veux transformer en exécutable (.exe si c'est sous windows).  +Voilà mon setup.py vide:
-Ils utilisent tous les 2 les bibliothèques graphiques PyQt4.  +
-Ils importent 2 modules, '​printx'​ et '​bibconcours',​ qui sont dans un répertoire relatif '​../​../​biblio'​.+
  
 <code python> <code python>
 #​!/​usr/​bin/​python #​!/​usr/​bin/​python
 # -*- coding: utf-8 -*- # -*- coding: utf-8 -*-
 +# Python 3
  
-# source d'​inspirationhttp://wiki.wxpython.org/​cx_freeze+"""​ 
 +Icone sous Windowsil faut: 
 +=> un xxx.ico pour integration dans le exe, avec "​icon=xxx.ico" 
 +=> un xxx.png pour integration avec PyQt4 + demander la recopie avec includefiles. 
 +"""​
  
 import sys, os import sys, os
Ligne 38: Ligne 43:
  
 #############################################################################​ #############################################################################​
-# preparation des options  +# preparation des options 
-path = sys.path.append(os.path.join("..", "..", "​biblio"​)) + 
-includes = ["​printx",​ "​bibconcours"​]+# chemins de recherche des modules 
 +# ajouter d'​autres chemins (absolus) si necessaire: ​sys.path ​+ ["chemin1", "chemin2"
 +path = sys.path 
 + 
 +# options d'​inclusion/​exclusion des modules 
 +includes = []  # nommer les modules non trouves par cx_freeze
 excludes = [] excludes = []
-packages = []+packages = []  # nommer les packages utilises 
 + 
 +# copier les fichiers non-Python et/ou repertoires et leur contenu: 
 +includefiles = [] 
 + 
 +if sys.platform == "​win32":​ 
 +    pass 
 +    # includefiles += [...] : ajouter les recopies specifiques à Windows 
 +elif sys.platform == "​linux2":​ 
 +    pass 
 +    # includefiles += [...] : ajouter les recopies specifiques à Linux 
 +else: 
 +    pass 
 +    # includefiles += [...] : cas du Mac OSX non traite ici 
 + 
 +# pour que les bibliotheques binaires de /usr/lib soient recopiees aussi sous Linux 
 +binpathincludes = [] 
 +if sys.platform == "​linux2":​ 
 +    binpathincludes += ["/​usr/​lib"​] 
 + 
 +# niveau d'​optimisation pour la compilation en bytecodes 
 +optimize = 0 
 + 
 +# si True, n'​affiche que les warning et les erreurs pendant le traitement cx_freeze 
 +silent = True
  
 +# construction du dictionnaire des options
 options = {"​path":​ path, options = {"​path":​ path,
            "​includes":​ includes,            "​includes":​ includes,
            "​excludes":​ excludes,            "​excludes":​ excludes,
-           "​packages":​ packages+           "​packages":​ packages
 +           "​include_files":​ includefiles,​ 
 +           "​bin_path_includes":​ binpathincludes,​ 
 +           "​create_shared_zip":​ False, ​ # <= ne pas generer de fichier zip 
 +           "​include_in_shared_zip":​ False, ​ # <= ne pas generer de fichier zip 
 +           "​compressed":​ False, ​ # <= ne pas generer de fichier zip 
 +           "​optimize":​ optimize, 
 +           "​silent":​ silent
            }            }
 +
 +# pour inclure sous Windows les dll system de Windows necessaires
 +if sys.platform == "​win32":​
 +    options["​include_msvcr"​] = True
  
 #############################################################################​ #############################################################################​
Ligne 54: Ligne 100:
 base = None base = None
 if sys.platform == "​win32":​ if sys.platform == "​win32":​
-    base = "​Win32GUI"​+    base = "​Win32GUI" ​ # pour application graphique sous Windows 
 +    # base = "​Console"​ # pour application en console sous Windows 
 + 
 +icone = None 
 +if sys.platform == "​win32":​ 
 +    icone = "​icone.ico"
  
 cible_1 = Executable( cible_1 = Executable(
-    script = "test.py", +    script="​monprogramme1.pyw", 
-    base = base, +    base=base,​ 
-    compress = True, +    compress=False, ​ # <= ne pas generer de fichier zip 
-    ​icon None,+    copyDependentFiles=True, 
 +    ​appendScriptToExe=True, 
 +    appendScriptToLibrary=False, ​ # <= ne pas generer de fichier zip 
 +    icon=icone
     )     )
  
 cible_2 = Executable( cible_2 = Executable(
-    script = "test2.py", +    script="​monprogramme2.pyw", 
-    base = base, +    base=base,​ 
-    compress = True, +    compress=False, 
-    ​icon None,+    copyDependentFiles=True, 
 +    ​appendScriptToExe=True, 
 +    appendScriptToLibrary=False,​ 
 +    icon=icone
     )     )
  
Ligne 73: Ligne 130:
 # creation du setup # creation du setup
 setup( setup(
-    name = "test_cx_freeze", +    name="monprogramme", 
-    version = "0.1", +    version="​1.00", 
-    description = "simple test de cx_freeze avec PyQt4", +    description="​monprogramme", 
-    author = "Tyrtamos", +    author="​auteurduprogramme", 
-    options = {"​build_exe":​ options}, +    options={"​build_exe":​ options}, 
-    executables = [cible_1, cible_2]+    executables=[cible_1,​ cible_2]
     )     )
 </​code>​ </​code>​
  
-Ce setup.py doit se trouver dans le répertoire dans lequel il y a les fichiers .py à convertir.+Utilisation:​
  
-On prend alors la console (cmd pour Windows), on se loge dans le répertoire en question, et on fait:+A titre d'​exemple:​ dans un répertoire,​ j'ai un développement comportant 2 programmes .py à lancer en exe: monprogramme1.py et monprogramme2.py. Il peut y avoir dans ce répertoire des modules personnels utilisés par ces 2 fichiers .py. 
 + 
 +On place le setup.py dans ce répertoire,​ et on le configure en fonction du programme. 
 + 
 +On prend alors la console (cmd pour Windows), on se loge dans le répertoire en question ​(avec "cd chemin"​), et on fait:
  
 <​code>​ <​code>​
Ligne 90: Ligne 151:
 </​code>​ </​code>​
  
-Il y a alors plusieurs pages d'exécution. En cas d'​erreur,​ il faut utiliser ​les options ​pour corriger, et inclure ou exclure ​les éléments concernés.+Il vient alors des lignes qui indiquent le déroulement du traitement par cx_freeze. On lit soigneusement pour voir s'il y a des erreurs. En cas d'​erreur,​ il faut corriger le setup.py et/ou corriger directement ​les programmes. 
 + 
 +Sous Windows, le résultat se trouve dans le sous-répertoire build/​exe.win32-3.4 (exemple ​pour Python 3.4)qui contient les 2 exécutables voulus "​monprogramme1.exe" ​et "​monprogramme2.exe"​ accompagnés de toutes ​les bibliothèques nécessaires,​ y compris bien entendu de l'​interpréteur Python
  
-Le résultat se trouve dans le sous-répertoire ​build/exe.win32-2.6 (exemple pour Python 2.sous Windows), qui contient les 2 exécutables voulus, et toutes les bibliothèques nécessaires,​ y compris bien entendu l'interpréteur Python+Le répertoire ​à diffuser est donc dans cet exemple: 'exe.win32-3.4'On peut le renommer en "​monprogramme"​ ou en n'​importe quoi d'​autre. On peut aussi le diffuser ​sous forme d'archive zip.
  
-Le répertoire à diffuser ​est donc dans cet exemple: ​'exe.win32-2.6'.+Il est bien sûr possible d'utiliser en plus un "​installeur"​ qui permettra à un utilisateur d'​installer ce programme comme n'​importe quel autre. Il y a des possibilités sous cx_freeze de faire cela, mais en ce qui me concerne, j'​utilise plutôt "inno Setup" sous Windows ([[http://​www.jrsoftware.org/​isinfo.php]]). Sous Linux, on peut créer des paquets (rpm, ...) mais je n'ai jamais essayé
  
-On peut, bien entendu traiter des cas plus complexes en utilisant toutes les nombreuses options possibles: voir [[http://​cx-freeze.sourceforge.net/cx_Freeze.html]]+On peut, bien entendu traiter des cas plus complexes en utilisant toutes les nombreuses options possibles: voir [[http://​cx-freeze.readthedocs.org/en/​latest/​index.html]].
  
-D'après ce que j'ai pu tester, le setup.py ​est identique sous Windows et sous Linux. Mais l'​exécutable Windows doit être construit sous Windows, et l'​exécutable Linux sous Linux, à cause des bibliothèques à intégrer qui sont différentes.+J'essaie de ne gérer qu'un seul setup.py ​pour Windows et Linux, quitte à mettre les particularités sous les tests "if sys.platform==..." ​Mais l'​exécutable Windows doit être construit sous Windows, et l'​exécutable Linux sous Linux, à cause des bibliothèques à intégrer qui sont différentes.
  
 \\ \\
cx_freeze.txt · Dernière modification: 2014/12/24 12:21 par tyrtamos