IdentifiantMot de passe
Loading...
Mot de passe oublié ?Je m'inscris ! (gratuit)
Navigation

Inscrivez-vous gratuitement
pour pouvoir participer, suivre les réponses en temps réel, voter pour les messages, poser vos propres questions et recevoir la newsletter

Déploiement/Installation Python Discussion :

Cx_freeze et numpy [Python 3.X]


Sujet :

Déploiement/Installation Python

  1. #1
    Membre actif

    Profil pro
    Inscrit en
    Janvier 2020
    Messages
    0
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Janvier 2020
    Messages : 0
    Points : 213
    Points
    213
    Par défaut Cx_freeze et numpy
    Bonjour,

    Je tente de créer un exécutable avec cx_freeze pour un petit programme utilisant numpy.
    Lors de la compilation je n'ai aucun message d'erreur, mais si je lance le .exe rien ne se passe. (Via le gestionnaire des tâches je vois que le programme est lancé mais il s'arrête immédiatement...)
    Je n'ai pas d'erreur de compilation , pas d'erreur au lancement...

    J'ai regardé les différentes solutions déjà en ligne :
    https://www.developpez.net/forums/d1...eur-lancement/
    https://www.developpez.net/forums/d1...qt-matplotlib/
    https://stackoverflow.com/questions/...in-cx-freeze-p.

    Mais elles n'ont pas fonctionné pour moi.
    J'ai mis de côté la partie de programme utilisant numpy pour faire un test. L'exécutable s'ouvre normalement dans ce cas...

    Voici mon fichier setup :
    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
    72
    73
    74
    75
    76
    77
    78
    79
    80
    81
    82
    83
    84
    85
    86
    87
    88
    89
    90
    #!/usr/bin/python
    # -*- coding: utf-8 -*-
    # Python 3
     
    """
    Template : recettes Tyrtamos
    Pas d'accent dans le setup.py, ni dans la description, ni dans les commentaires
     
    Icone sous Windows: il faut:
    => un xxx.ico pour integration dans le exe, avec "icon=xxx.ico"
    => un xxx.png pour integration avec PyQt5 + demander la copie avec includefiles.  
    """
     
    import sys, os
    from cx_Freeze import setup, Executable
     
    import numpy
     
    os.environ["TCL_LIBRARY"] = r"C:\\ProgramData\\Anaconda3\\tcl\\tcl8.6" 
    os.environ["TK_LIBRARY"] = r"C:\\ProgramData\\Anaconda3\\tcl\\tk8.6" 
     
    #############################################################################
    # preparation des options 
     
    # chemins de recherche des modules
    path = sys.path
     
    # options d'inclusion/exclusion des modules
    includes = ["atexit","numpy.core._methods", "numpy.lib.format"]
    excludes = ["tkinter"]
    packages = ["pkg_resources._vendor","numpy"]
     
    # copier les fichiers et/ou repertoires et leur contenu:
    includefiles=[(r"C:\Users\epic\Desktop\Python\images\images[7].png"),"flowdef.txt"]
    includefiles += [(r"C:\Users\epic\Desktop\Python\gui","gui")] # recopier l'icone.png de la fenetre ici
    includefiles += [(r"C:\Users\epic\Desktop\Python\images","images")]
     
    includefiles += [(r"C:\ProgramData\Anaconda3\Library\plugins\platforms","platforms")]
    includefiles += [(r"C:\ProgramData\Anaconda3\Library\bin\sqlite3.dll","sqlite3.dll")]
    includefiles += [(r"C:\ProgramData\Anaconda3\Lib\site-packages\pint","pint")]
    #includefiles += [(r"E:\Python34\Lib\site-packages\PyQt4\translations","translations")]
     
     
    binpathincludes = []
     
     
    # construction du dictionnaire des options
    options = {"path": path,
               "includes": includes,
               "excludes": excludes,
               "packages": packages,
               "include_files": includefiles,
               "bin_path_includes": binpathincludes,
     
               }
     
    # pour inclure sous Windows les dll system necessaires
    if sys.platform == "win32":
        options["include_msvcr"] = True
     
    #############################################################################
    # preparation des cibles
    base = None
    if sys.platform == "win32":
        # plateforme Windows
        base = "Win32GUI" # pour les programmes graphiques
        #base = "Console" # pour les programmes en console
     
    icone = None
    if sys.platform == "win32":
        icone = (r"C:\Users\epic\Desktop\Python\images\images[7].ico") # mettre ici l'icone.ico pour integration dans l'exe
     
    cible_1 = Executable(
        script = "aide_calculs_conversions.py",
        base = base,
        icon=icone
     
        )
     
     
    #############################################################################
    # creation du setup
    setup(
        name = "Aide aux conversions et calculs",
        version = "3.00",
        description = "Application contenant des utilitaires pour des conversions et calculs simples",
        author = "EPIC",
        options = {"build_exe": options},
        executables = [cible_1]
        )
    Si besoin je possède un fichier texte avec les informations de la compilation (trop volumineux pour être posté mais si besoin je peux le transmettre).
    Merci d'avance pour votre aide

    Bonne journée

  2. #2
    Expert éminent
    Avatar de tyrtamos
    Homme Profil pro
    Retraité
    Inscrit en
    Décembre 2007
    Messages
    4 461
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Var (Provence Alpes Côte d'Azur)

    Informations professionnelles :
    Activité : Retraité

    Informations forums :
    Inscription : Décembre 2007
    Messages : 4 461
    Points : 9 248
    Points
    9 248
    Billets dans le blog
    6
    Par défaut
    Bonjour,

    Ce genre de traitement est toujours difficile, parce que les numpy, scipy et matplotlib demandent des importations bizarres: PyQt5, wxPython, tkinter, etc... alors qu'on ne les utilise pas.

    Avec les versions précédentes de cx_freeze, j'avais trouvé un setup qui fonctionnait, avec des demandes de packages surprenantes du genre:
    "matplotlib.backends.backend_tkagg", "tkinter", "tkinter.filedialog", "scipy.sparse.csgraph._validation", "scipy.special._ufuncs_cxx"

    Mais avec la dernière version de cx_freeze, ça ne marche plus...

    Alors, je te propose autre chose: utilise pyinstaller. Je l'utilise de plus en plus, et ça a l'air de bien marcher, avec des instructions moins complexes, et donne des exe moins volumineux.

    Comme je n'ai pas ton code python, j'ai essayé sur un programme de test (que j'ai trouvé quelque part sur le web) qui utilise en même temps numpy, scipy et matplotlib, et qui trace des points sur une courbe dans une fenêtre:

    programme "test01.py":

    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
    # -*- coding: utf-8 -*-
    # Python 3
     
    import numpy as np
    import matplotlib.pyplot as plt
    from scipy.optimize import leastsq
     
    x = np.linspace(0, 50, 100)
    y_true = 5 * np.exp(-0.1 * x)
    y_meas = y_true + np.random.rand(len(x))
    p0 = [];p0.append(1);p0.append(1)
    p = plt.figure(1)
    p = plt.plot(x, y_meas, 'bo')
    def residuals1(p, y, x):
            err = y - p[0] * np.exp(-p[1] * x)
            return err
    x = np.linspace(0, 50, 100)
    y_true = 5 * np.exp(-0.1 * x)
    y_meas = y_true + np.random.rand(len(x))
    plsq = leastsq(residuals1, p0, args=(y_meas, x), maxfev=5000)
    p = plt.figure(1)
    p = plt.plot(x, plsq[0][0] * np.exp(-plsq[0][1] * x), 'r.', label="lsq")
    plt.legend()
    plt.show()
    Ensuite, pour lancer le traitement par pyinstaller, je lance un fichier bat qui contient:

    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
    SET programme=test01
     
    IF EXIST build_onedir RMDIR /S /Q build_onedir
    IF EXIST dist_onedir RMDIR /S /Q dist_onedir
     
    pyinstaller.exe ^
    --clean ^
    --noconfirm ^
    --noconsole ^
    --onedir ^
    --noupx ^
    --distpath ".\dist_onedir" ^
    --workpath ".\build_onedir" ^
    %programme%.py
    PAUSE
    NB: sous Windows, la ligne qui se termine par "^" veut dire que la ligne de commande continue par la ligne suivante.

    Et cela donne dans le sous-répertoire "dist_onedir\test01" un ensemble de fichiers, dont le "test01.exe" qui s'exécute sans problème.

    Et, curiosité de pyinstaller, on peut demander à tout mettre dans le "exe"!!! Voilà le fichier bat correspondant:

    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
    SET programme=test01
     
    IF EXIST build_onefile RMDIR /S /Q build_onefile
    IF EXIST dist_onefile RMDIR /S /Q dist_onefile
     
    pyinstaller ^
    --clean ^
    --noconfirm ^
    --noconsole ^
    --onefile ^
    --noupx ^
    --distpath ".\dist_onefile" ^
    --workpath ".\build_onefile" ^
    %programme%.py
    PAUSE
    Ce qui donne le fichier test01.exe tout seul dans le sous-répertoire "dist_onefile", qui une taille de 94.552ko (ce qui est raisonnable pour le bazar en question), et qui fonctionne parfaitement.

    Il reste que la simplicité de la version "onefile" (tout dans un seule fichier exe) est un peu artificielle, puisqu'au lancement, le programme commence à se désarchiver dans un répertoire temporaire, et c'est là qu'il s'exécute.

    Et dans les 2 cas, ce n'est pas une compilation en code natif comme en C, mais une "encapsulation" de l'interpréteur et des bibliothèques nécessaires avec le programme lui-même, seulement compilé en "bytecodes".

    Enfin, il ne faut pas oublier de calculer le chemin disque du programme exe quand on veut qu'il récupère des données! (c'était aussi le cas avec cx_freeze, mais ce n'est pas le même calcul).

    [tout ça avec Python v3.7 64bits et pyinstaller v3.4]
    Un expert est une personne qui a fait toutes les erreurs qui peuvent être faites, dans un domaine étroit... (Niels Bohr)
    Mes recettes python: http://www.jpvweb.com

  3. #3
    Membre actif

    Profil pro
    Inscrit en
    Janvier 2020
    Messages
    0
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Janvier 2020
    Messages : 0
    Points : 213
    Points
    213
    Par défaut
    Bonjour,

    Merci pour la réponse.
    Dans une précédente discussion j'avais demandé un avis sur les méthodes pour freezer un code et je savais que j'allais devoir me mettre à Pyinstaller.

    C'est le moment de franchir le pas. J'ai tenté avec la commande de base :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    pyinstaller --onefile --windowed nom_fichier.py
    La compilation avait abouti mais le fichier ne se "lance" pas (présent dans le gestionnaire des tâches mais pas d'affichage).

    Je vais suivre ta méthode et je reviendrai avec les résultats.

    Encore merci pour toutes les précisions, c'est très utile !

    Bonne journée

  4. #4
    Membre actif

    Profil pro
    Inscrit en
    Janvier 2020
    Messages
    0
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Janvier 2020
    Messages : 0
    Points : 213
    Points
    213
    Par défaut
    Bonjour,

    Après quelques tentatives hier je suis face à un ou deux problèmes et interrogations.

    Tout d'abord lors de la compilation deux dossiers sont créés : build_onedir et dist_onedir. Seul l'exécutable du dossier dist_onedir fonctionne. Pourquoi ?

    J'ai fait un test avec votre programme test01, qui fonctionne.
    Je suis ensuite passée à mon programme, mais lors du lancement de l'exe j'obtiens cette erreur : Failed to execute script.

    Je travaille avec Anaconda et je me demande si mon problème ne serait pas lié à cela...
    Je vous joins les informations de compilation (il manque les 2-3 premères lignes). Certains modules n'ont pas pu importé il me semble, dont PyQt5 si j'ai bien suivi.

    Je commence à me dire qu'Anaconda avait bien des aspects pratiques quand on débute en programmation car de nombreuses bibliothèques sont déjà intégrées ainsi que l'EDI mais maintenant il me cause plus de problèmes qu'autre chose.
    Dans le cas d'un passage à une installation de Python sans Anaconda quel EDI me recommenderiez-vous ?

    Bonne journée
    Fichiers attachés Fichiers attachés

  5. #5
    Expert éminent
    Avatar de tyrtamos
    Homme Profil pro
    Retraité
    Inscrit en
    Décembre 2007
    Messages
    4 461
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Var (Provence Alpes Côte d'Azur)

    Informations professionnelles :
    Activité : Retraité

    Informations forums :
    Inscription : Décembre 2007
    Messages : 4 461
    Points : 9 248
    Points
    9 248
    Billets dans le blog
    6
    Par défaut
    Bonjour,

    Je n'utilise pas anaconda, mais peut-être y-a-il une manière particulière d'installer pyinstaller comme:

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    conda install -c conda-forge pyinstaller
    J'ai vu aussi qu'il fallait le module externe "pywin32": vérifie si tu l'as bien.

    Citation Envoyé par Mimisator Voir le message
    Tout d'abord lors de la compilation deux dossiers sont créés : build_onedir et dist_onedir. Seul l'exécutable du dossier dist_onedir fonctionne. Pourquoi ?
    L'autre (build_onedir) est un répertoire de travail uniquement destiné au traitement, et inutile après.

    Tu as vu que mon fichier .bat renommait systématiquement les 2 répertoires (build => build_onedir et dist => dist_onedir). C'est tout simplement pour conserver à la fois une version "onedir" et une version "onefile".

    De même, il est important de supprimer ces répertoires au début de chaque traitement afin de ne pas avoir de mélanges entre 2 traitements successifs.
    Un expert est une personne qui a fait toutes les erreurs qui peuvent être faites, dans un domaine étroit... (Niels Bohr)
    Mes recettes python: http://www.jpvweb.com

  6. #6
    Membre actif

    Profil pro
    Inscrit en
    Janvier 2020
    Messages
    0
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Janvier 2020
    Messages : 0
    Points : 213
    Points
    213
    Par défaut
    Bonjour,

    J'ai justement installé Pyinstaller via les commandes conda et j'ai bien ajouté Pywin2 et Pefile.
    J'ai aussi modifié le fichier qt dans le dossier hook de Pyinstaller (comme vu ici : https://stackoverflow.com/questions/...in-directories)
    Je vais tenter de remettre le fichier d'origine.

    Merci pour ces précisions, je n'étais pas sure... Les noms permettaient de pencher en ce sens.
    J'avais noté la différenciation du one_dir, one_file.

  7. #7
    Membre actif

    Profil pro
    Inscrit en
    Janvier 2020
    Messages
    0
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Janvier 2020
    Messages : 0
    Points : 213
    Points
    213
    Par défaut
    Bonjour,

    J'ai finalement désinstallé Anaconda pour une version "classique" de python et cela fonctionne bien !

    Encore merci pour votre aide.

    Bonne journée

+ Répondre à la discussion
Cette discussion est résolue.

Discussions similaires

  1. [Tutoriel] Initiation NumpY Episode II
    Par parp1 dans le forum Contribuez
    Réponses: 1
    Dernier message: 19/06/2007, 18h03
  2. [NumPy] histrogram
    Par deb_Sous_Python dans le forum Calcul scientifique
    Réponses: 2
    Dernier message: 30/05/2007, 15h32
  3. [numpy] problème dans mes imports
    Par Kuroro dans le forum Calcul scientifique
    Réponses: 1
    Dernier message: 28/05/2007, 23h07
  4. [numpy] fromstring/tostring : problème!
    Par Panthère Bleue dans le forum Calcul scientifique
    Réponses: 1
    Dernier message: 13/08/2006, 22h27
  5. numpy:dilatation gestion des bords?
    Par parp1 dans le forum Calcul scientifique
    Réponses: 5
    Dernier message: 12/06/2006, 16h05

Partager

Partager
  • Envoyer la discussion sur Viadeo
  • Envoyer la discussion sur Twitter
  • Envoyer la discussion sur Google
  • Envoyer la discussion sur Facebook
  • Envoyer la discussion sur Digg
  • Envoyer la discussion sur Delicious
  • Envoyer la discussion sur MySpace
  • Envoyer la discussion sur Yahoo