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

Python Discussion :

cx_freeze: inclure les données manquantes dans un setup


Sujet :

Python

Vue hybride

Message précédent Message précédent   Message suivant Message suivant
  1. #1
    Membre éprouvé
    Profil pro
    Inscrit en
    Février 2010
    Messages
    2 051
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Février 2010
    Messages : 2 051
    Par défaut cx_freeze: inclure les données manquantes dans un setup
    Bonjour tous,

    je fais suite à une précédente discussion où je ne savais pas trop comment distribuer des données python:
    http://www.developpez.net/forums/d14...py-matplotlib/

    Maintenant, grâce à votre aide je me suis mis une bonne fois pour toute à "cxfreeze" et j'arrive à faire déjà pas mal de chose à l'aide de ce fichier setup très inspiré de cette page: http://python.jpvweb.com/mesrecettes...p?id=cx_freeze

    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
    #!/usr/bin/python
    # -*- coding: utf-8 -*-
    #Icone sous Windows: il 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
    from cx_Freeze import setup, Executable
    #############################################################################
    # preparation des options
    # 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 = []
    packages = ["numpy","scipy","matplotlib"]  # 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,
               "includes": includes,
               "excludes": excludes,
               "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
    #############################################################################
    # preparation des cibles
    base = None
    if sys.platform == "win32":
        #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(
        script="hello.py",
        base=base,
        compress=False,  # <= ne pas generer de fichier zip
        copyDependentFiles=True,
        appendScriptToExe=True,
        appendScriptToLibrary=False,  # <= ne pas generer de fichier zip
        #icon=icone
        )
    #############################################################################
    # creation du setup
    setup(
        name="monprogramme",
        version="1.00",
        description="monprogramme",
        author="auteurduprogramme",
        options={"build_exe": options},
    	executables=[cible_1]
        )
    par contre pour certains bout de code, par exemple celui ci:
    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
    import numpy as np
    import matplotlib.pyplot as plt
    from scipy.optimize import leastsq
    import FileDialog
    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()
    cxfreeze n'arrivent pas à me trouver tout les dll et librairies nécessaires (ici des problèmes avec scipy.optimize) :
    Pièce jointe 164722

    Je me doute que je dois ajouter des chemins dans les listes "includefiles", "includes", "excludes" mais je n'ai pas vraiment compris comment le faire et quoi rajouter dans ces listes ??? des fichiers .py ? des .pyc ?

    pourriez vous m'expliquer qu'es ce que l'on attend dans ce type de listes "includefiles", "includes", "excludes" et comment le faire sur cet exemple "simple" ?


    j'ai trouvé des choses intéressantes sur le net :
    https://bitbucket.org/anthony_tuinin...cx_freeze-with
    mais j'ai deux difficultés : je ne suis pas un craque en anglais et en plus la syntaxe python utilisées est un peu difficile pour moi car je suis débutant (écriture trop condensée)

    pourriez vous me montrer avec une manière simple comment résoudre mon problème s'il vous plait ?

    merci beaucoup pour votre aide et bonne fin d'année

  2. #2
    Expert confirmé

    Avatar de deusyss
    Homme Profil pro
    Expert Python
    Inscrit en
    Mars 2010
    Messages
    1 659
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 42
    Localisation : France, Ille et Vilaine (Bretagne)

    Informations professionnelles :
    Activité : Expert Python
    Secteur : High Tech - Éditeur de logiciels

    Informations forums :
    Inscription : Mars 2010
    Messages : 1 659
    Par défaut
    Salut,

    J'ai été consulté ton ancien post, et à la vu de celui-ci j'ai vu que tu te référais aux recette de Tyrtamos, très bonne chose.

    Concernant ton message d'erreur, je pense que le problème ne vient pas du côté de cx_freeze, mais plutot de Scipy. Si tu regarde bien le message d'erreur, il cherche quelque chose dans les libs Python, du côté de Scipy.

    D’ailleurs si tu cherches le message d'erreur sur le net "from scipy.optimize import minpack2", les réponses renvoyées semblent indiquer un probleme de compatibilité entre scipy et windows 8. D'ou ma question: ne serais-tu pas sur cet OS?

    Un lien trouvé: http://www.lfd.uci.edu/~gohlke/pythonlibs/#numpy, qui apparemment constitue une version alternative compatible windows 8.

  3. #3
    Expert confirmé
    Avatar de tyrtamos
    Homme Profil pro
    Retraité
    Inscrit en
    Décembre 2007
    Messages
    4 486
    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 486
    Billets dans le blog
    6
    Par défaut
    Bonjour,

    J'ai essayé avec ton code:

    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
    #!/usr/bin/python
    # -*- coding: utf-8 -*-
    # Python 3
     
    import numpy as np
    import matplotlib.pyplot as plt
    from scipy.optimize import leastsq
    # import FileDialog
     
    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()
    Mais je travaille avec Python 3.4. J'ai donc installé numpy, scipy et matplotlib.

    J'ai construit le setup.py à partir de la version vide que j'ai donnée. Plusieurs fois, j'ai eu des erreurs de runtime, et au fur et à mesure, j'ai réinjecté ce qui semblait manquer. Ce qui donne à la fin dans le setup:

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    packages = ["matplotlib.backends.backend_tkagg", "tkinter", "tkinter.filedialog", "scipy.sparse.csgraph._validation",
                "scipy.special._ufuncs_cxx"]
    Et à la fin: ça marche: j'ai la fenêtre avec le dessin (la courbe avec les points)!!!

    Mais comme il s'agit de Python 3, je ne sais pas si ce sont les mêmes packages qui manqueront.

    => Essaie de réinjecter ce qui manque au runtime avec ton Python 2.7 dans l'option package de setup.py!

  4. #4
    Membre éprouvé
    Profil pro
    Inscrit en
    Février 2010
    Messages
    2 051
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Février 2010
    Messages : 2 051
    Par défaut
    Citation Envoyé par deusyss Voir le message
    Salut,
    Salut Deusyss et merci beaucoup de prendre le temps de m'aider
    Citation Envoyé par deusyss Voir le message
    J'ai été consulté ton ancien post, et à la vu de celui-ci j'ai vu que tu te référais aux recette de Tyrtamos, très bonne chose.
    oui il a l'air très flexible et comme je n'ai pas trop capté la doc de cxfreeze ça m'aide beaucoup
    Citation Envoyé par deusyss Voir le message
    Concernant ton message d'erreur, je pense que le problème ne vient pas du côté de cx_freeze, mais plutot de Scipy. Si tu regarde bien le message d'erreur, il cherche quelque chose dans les libs Python, du côté de Scipy.
    je ne pense pas que ça vienne de scipy car lorsque je lance mon programme il fonctionne correctement et je n'ai que le problème lorsque j'essai de "compiler" mon programme avec "cxfreeze"...?
    Citation Envoyé par deusyss Voir le message
    D’ailleurs si tu cherches le message d'erreur sur le net "from scipy.optimize import minpack2", les réponses renvoyées semblent indiquer un probleme de compatibilité entre scipy et windows 8. D'ou ma question: ne serais-tu pas sur cet OS?
    Un lien trouvé: http://www.lfd.uci.edu/~gohlke/pythonlibs/#numpy, qui apparemment constitue une version alternative compatible windows 8.
    en fait non je suis sous windows XP, je ne pense pas que ça soit donc lié à W8. J'ai cru comprendre que pour résoudre ce problème il suffit de donner manuellement accès aux fichiers nécessaires (scipy.optimize) le problème est que je ne comprends pas trop comment le faire...




    Citation Envoyé par tyrtamos Voir le message
    Bonjour,
    salut Tyrtamos et encore merci de me suivre dans mes galères

    Citation Envoyé par tyrtamos Voir le message
    J'ai essayé avec ton code
    Mais je travaille avec Python 3.4. J'ai donc installé numpy, scipy et matplotlib.
    J'ai construit le setup.py à partir de la version vide que j'ai donnée. Plusieurs fois, j'ai eu des erreurs de runtime, et au fur et à mesure, j'ai réinjecté ce qui semblait manquer.
    OK, moi aussi j'ai procédé comme ceci mais avec python 2.7, j'avais des erreurs liées à numpy, scipy ou matplotlib et j'ai donc fais
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    packages = ["numpy","scipy","matplotlib"]
    et ça a débloqué une bonne partie de mes problèmes (si je n'utilise pas scipy.optimize tout le reste fonctionne)

    Citation Envoyé par tyrtamos Voir le message
    Ce qui donne à la fin dans le setup:
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    packages = ["matplotlib.backends.backend_tkagg", "tkinter", "tkinter.filedialog", "scipy.sparse.csgraph._validation",
                "scipy.special._ufuncs_cxx"]
    j'aimerais bien que tu m'expliques comment tu en arrives à importer des packages de ce type ? c'est des noms que tu retrouves dans l'erreur qu'affiche cxfreeze lors de la compilation ? par exemple comme tu as su q'il fallait mettre "tkinter.filedialog", cxfreeze t'as dis quelque chose du type "tkinter.filedialog" is missing ?
    Moi j'arrive à comprendre quand je dois rajouter des choses générales du type "numpy", "scipy"...etc mais je ne comprends pas comment tu trouves ces noms de fonctions complexe dont je ne sais même pas à quoi ils correspondent ?

    Ceci dit, j'ai testé ton code et chez moi ça ne résout malheureusement pas le problème car il me dit qu'il n'y a pas de module nommé "tkinter", j'ai essayé de rajouter "import tkinter" dans mon code mais le même message revient... ce tkinter est une bibliothèque spéciale qui doit être installée au préalable ?


    Citation Envoyé par tyrtamos Voir le message
    Et à la fin: ça marche: j'ai la fenêtre avec le dessin (la courbe avec les points)!!!
    Mais comme il s'agit de Python 3, je ne sais pas si ce sont les mêmes packages qui manqueront.
    => Essaie de réinjecter ce qui manque au runtime avec ton Python 2.7 dans l'option package de setup.py!
    mince, j'aimerais bien que ça fonctionne aussi... c'est une galère ce cxfreeze
    en fait j'aimerais bien procéder au même type de fonctionnement que toi mais je ne comprends pas ce qui te fait rajouter tel ou tel package... De plus, ce qui me perturbe c'est que sur le net (cf. mon dernier lien) j'ai l'impression qu'il faut rajouter des choses dans les listes
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    includes = []
    excludes = []
    includefiles
    mais là aussi je ne comprends pas ce que font exactement ces listes et donc je comprends encore moins ce que je dois mettre dedans

    EDIT: j'ai pensé à un problème d'installation mais j'ai vérifié sur ce site (celui que j'utilise pour installer ds librairies):
    http://www.lfd.uci.edu/~gohlke/pythonlibs/

    et j'ai bien installé numpy, scipy, et matplolib dans le bon ordre et avec les modules obligatoires demandés.... (pas ceux optionnels....)

    j'ai vérifé ce "minpack2" et j'en est trouvé un dans le dossier lib/script-packages/scipy/optimize et il a l'extension pyd: "minpack2.pyd"
    j'ai essayé de le copier dans mon répertoire build/exe32...Etc mais rien n'y fait

    j'ai une question quand même à propos de cxfreeze:
    au lieu de se faire ch... avec ces importations de librairies/modules il n'est pas possible de copier coller carrement les bibliothèses "numpy", "scipy", "matplolib" dans mon répertoire de travail avant de lancer "cxfreeze" ? là au moins il devrait tout trouver ?

  5. #5
    Expert confirmé
    Avatar de tyrtamos
    Homme Profil pro
    Retraité
    Inscrit en
    Décembre 2007
    Messages
    4 486
    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 486
    Billets dans le blog
    6
    Par défaut
    J'ai bien dit que j'avais des erreurs de runtime, c'est à dire d'exécution.

    En lançant le .exe (je le lance dans la console cmd.exe pour être sûr d'avoir tous les messages d'erreur d'exécution), il vient une fenêtre qui donne le message d'erreur et la dernière ligne dit qu'il ne trouve pas xxx.yyy.zzz: j'ajoute alors ce nom dans la liste des packages. Pourquoi packages? A cause des points!

    S'il ne trouve pas tkinter, c'est parce qu'en Python 2, il s'appelle Tkinter (avec une majuscule).

    cx_freeze fait des choses très complexes, et il faut l'aider un peu quand il ne trouve pas tout de lui-même. Dans certains cas, s'il ne trouve pas un module système simple, on l'ajoute dans la liste des "includes" (on cite simplement son nom entre guillemets et sans son chemin). Pour "excludes": je ne l'ai encore jamais utilisé.

    C'est très différent pour "includefiles": on est sûr que les fichiers et répertoires "non-python" ne seront pas recopiés: il faut donc en faire explicitement la demande! Par exemple: une icône de fenêtre, une image, des fichiers de traduction, des plugins, un répertoire dans lequel il y a des fichiers d'aide, etc...

    [edit] je réponds à ta dernière question: oui, dans certains cas, on peut se contenter de recopier grâce à "includefiles" le module ou le répertoire du package! Mais il ne faut le faire que si rien d'autre ne marche parce que ce n'est pas "très propre" comme boulot...

  6. #6
    Membre éprouvé
    Profil pro
    Inscrit en
    Février 2010
    Messages
    2 051
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Février 2010
    Messages : 2 051
    Par défaut
    merci beaucoup pour ta réponse.

    je suis reparti de 0 et j'ai executé mon code qui m'a donné ce message:
    Pièce jointe 164755

    ici le message paraît assez clair et en mettant ceci ça semble résoudre le problème:
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    packages = ["matplotlib.backends.backend_tkagg"]
    mais maintenant j'ai ce message d'erreur:
    Pièce jointe 164756

    ce message d'erreur est moins clair que l'autre, j'ai essayé d'imorter :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    packages = ["matplotlib.backends.backend_tkagg","six"]
    où pas mal d'autre choses mais dans ce cas là je ne trouve pas exactement la syntaxe à employer. Dans le précédent c'était assez facile de comprendre sur base de ton exemple mais ici je ne comprends pas trop la logique et qu'elle module je dois mettre.... ou dirait un sous module du précédent ?

    pourrais tu me dire ce que je dois mettre dans ce cas ci stp ?

    merci

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

Discussions similaires

  1. [XSLT] Inclure les données d'un fichier XML dans un fichier
    Par SimOOn dans le forum Bibliothèques et frameworks
    Réponses: 2
    Dernier message: 20/04/2007, 16h26
  2. Les données sont dans la base, mais ne s'affichent pas
    Par ryan dans le forum MS SQL Server
    Réponses: 2
    Dernier message: 31/03/2006, 10h59
  3. Réponses: 8
    Dernier message: 19/05/2005, 16h03
  4. Récupérer les données interbase dans une TStringGrid
    Par Ousse dans le forum Bases de données
    Réponses: 1
    Dernier message: 24/03/2005, 12h51
  5. problème xsl : inclure une donnée xml dans une balise html
    Par djodjo dans le forum XSL/XSLT/XPATH
    Réponses: 3
    Dernier message: 03/01/2003, 09h24

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