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 :

exe corrompu créé avec Cx Freeze (lxml)


Sujet :

Déploiement/Installation Python

  1. #1
    Futur Membre du Club
    Homme Profil pro
    Inscrit en
    Mai 2013
    Messages
    6
    Détails du profil
    Informations personnelles :
    Sexe : Homme

    Informations forums :
    Inscription : Mai 2013
    Messages : 6
    Points : 5
    Points
    5
    Par défaut exe corrompu créé avec Cx Freeze (lxml)
    Bonjour,
    ma config : win 7 64bits mais Python 32 32bits, cxFreeze 4.3.1

    J'ai créé une application avec PyQt4 sous PySide/eclipse que je veux maintenant distribuer. Je compile avec cxFreeze grâce à un setup (modèle Tyrtamos). La compilation se passe sans problème mais lorsque je lance l'exe j'ai ce message d'erreur :

    Premier réflexe : mettre le module '_elementpath' dans la liste exclude. Mais il ressort alors une erreur de compilation sur le module 'inspect' que je n'arrive pas à trouver et de plus je me dis qu'à force de supprimer des modules rien ne va plus fonctionner.

    Des idées pour obtenir un exe correct ?
    Merci d'avance.

    Voici ma déclaration d'import des modules lxml:
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    from lxml import etree
    from lxml.etree import ElementTree, parse, XPath, XMLParser
    et mon setup.py réalisé d'après le tuto de Tyrtamos et les instructions PySide

    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
    #!/usr/bin/python
    # -*- coding: utf-8 -*-
    # Python 2.7
    # 02/2011
     
    import sys, os
    from cx_Freeze import setup, Executable
     
    #############################################################################
    # pr�paration des options
     
    # chemins de recherche des modules
    path = sys.path
     
    # options d'inclusion/exclusion des modules
    includes = ["sip","atexit","PySide.QtNetwork","collections"]
    excludes = ["lxml.etree.inspect"]
    packages = []
     
    # copier les fichiers et/ou r�pertoires et leur contenu
    includefiles = [("resources", "resources"), ("tmp", "tmp"), ("tmp2", "tmp2")]
    if sys.platform == "linux2":
        includefiles += [(r"/usr/lib/qt4/plugins/sqldrivers", "sqldrivers")]
        includefiles += [("/usr/share/qt4/translations", "translations")]
    elif sys.platform == "win32":
        includefiles += [(r"C:\Python32\Lib\site-packages\PyQt4\plugins\sqldrivers", "sqldrivers")]
        #includefiles += [(r"C:\Python32\Lib\site-packages\PyQt4\translations\qt_help_fr.qm", sys.path)]
        #includefiles += [(r"C:\Python32\Lib\site-packages\PIL\jpegpresets")]
    else:
        pass
     
    # inclusion �ventuelle de biblioth�ques suppl�mentaires
    binpathincludes = []
    if sys.platform == "linux2":
        # pour que les biblioth�ques de /usr/lib soient copi�es aussi
        binpathincludes += ["/usr/lib"]
     
    # 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
               }
     
    #############################################################################
    # pr�paration des cibles
    base = None
    if sys.platform == "win32":
        base = "Win32GUI"
     
    cible_1 = Executable(
        script="dialogue.py",
        targetName = "PersonnaLiseur.exe",
        base=base,
        compress=True,
        icon="resources/PL.ico",
        appendScriptToExe=True,
        appendScriptToLibrary=False
        )
     
    #############################################################################
    # cr�ation du setup
    setup(
        name="PersonnaLiseur",
        version="0.1",
        description="Personnalisation de fichiers epub",
        author="VdF",
        options={"build_exe": options},
        executables=[cible_1]
        )

  2. #2
    Expert éminent
    Avatar de tyrtamos
    Homme Profil pro
    Retraité
    Inscrit en
    Décembre 2007
    Messages
    4 462
    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 462
    Points : 9 249
    Points
    9 249
    Billets dans le blog
    6
    Par défaut
    Bonjour,

    Juste quelques idées.

    Dans la mesure où cx_freeze ne trouve pas tout seul le module dont il a besoin, il faut l'aider:

    - mettre "_elementpath" dans l'option "includes" (et pas "excludes").

    - ou "lxml._elementpath"? Voir exemple ici: http://stackoverflow.com/questions/4...-problem-ascil

    - si ça ne suffit pas, ajouter l'importation de "lxml._elementpath" dans le code Python et pas seulement dans le setup.py


    Petit complément: avec le petit code suivant (à ajouter au setup), on peut intégrer les dll de Windows à la bonne version, pour faciliter la distribution à d'autres versions de Windows (mon tuto a été mis à jour):

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    # pour inclure sous Windows les dll system necessaires
    if sys.platform == "win32":
        options["include_msvcr"] = True
    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
    Futur Membre du Club
    Homme Profil pro
    Inscrit en
    Mai 2013
    Messages
    6
    Détails du profil
    Informations personnelles :
    Sexe : Homme

    Informations forums :
    Inscription : Mai 2013
    Messages : 6
    Points : 5
    Points
    5
    Par défaut
    Bonjour,
    quelques nouvelles :
    j'ai passé lxml._elementpath dans les include du setup et j'ai fini par débusquer le mystérieux 'inspect'. C'est un module de base de Python (et non pas de lxml comme je le croyais).
    Je l'ai donc passé dans les import du code source.

    Compilation par cx_Freeze et lancement de l'exe : tout à l'air de bien se passer.
    Je continue mes tests au cas-où.
    Merci

  4. #4
    Membre du Club
    Homme Profil pro
    Ingénieur calcul et simulation
    Inscrit en
    Juin 2013
    Messages
    41
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : Allemagne

    Informations professionnelles :
    Activité : Ingénieur calcul et simulation
    Secteur : Industrie

    Informations forums :
    Inscription : Juin 2013
    Messages : 41
    Points : 60
    Points
    60
    Par défaut
    Bonjour,

    J'ai eu le même problème et grâce à vous j'ai pu le résoudre.
    Cependant, j'ai un autre problème qui est apparu à la suite : le soft a l'air de bien fonctionner, mais lorsque je clique sur son bouton principal j'ai l'erreur suivante.

    Exception in Tkinter callback
    Traceback (most recent call last):
    File "Tkinter.pyc", line 1470, in __call__
    File "pptx_02.py", line 187, in ButtonErstellen
    File "pptx\api.pyc", line 29, in __init__
    File "pptx\presentation.pyc", line 87, in __init__
    File "pptx\presentation.pyc", line 170, in __open
    File "pptx\packaging.pyc", line 88, in open
    File "pptx\packaging.pyc", line 671, in __new__
    PackageNotFoundError: Package not found at 'C:\Python27\dist\library.zip\pptx\templates\default.pptx'

    Et quand je vérifie, effectivement, dans pptx, il n'y a pas de dossier template.
    Qu'à cela ne tienne, je rajoute manuellement le fichier default.pptx à cette adresse, et ... Exactement la même erreur continue d'apparaitre à chaque fois bien qu'à présent le fichier existe (et est bien le bon vu que le programme fonctionne quand je le lance en .py depuis l'interpréteur).

    Auriez-vous une idée du problème ?

    Merci d'avance !

  5. #5
    Expert éminent
    Avatar de tyrtamos
    Homme Profil pro
    Retraité
    Inscrit en
    Décembre 2007
    Messages
    4 462
    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 462
    Points : 9 249
    Points
    9 249
    Billets dans le blog
    6
    Par défaut
    Bonjour,

    Juste une idée: il est possible de forcer l'intégration d'un fichier dans le library.zip en ajoutant dans le options du setup.py: "zip_includes":[].

    Voir dans la doc la syntaxe exacte de ce qu'il faut mettre dans les crochets. Il est possible que ce soit la suivante: un tuple avec en premier l'adresse absolue du fichier et en second le répertoire relatif (à library.zip) dans lequel ce fichier doit être placé.

    D'une manière générale, cx_freeze intègre facilement et automatiquement les fichiers .py et .pyw, mais pas les autres (.ico, .txt, .html, etc...) qu'il faut préciser. Mais je ne travaille pas avec tkinter, et je ne sais pas ce qu'est 'pptx'.

    A noter que dans l'adresse indiquée ('C:\Python27\dist\library.zip\pptx\templates\default.pptx'), si le répertoire dist résulte de l'application de cx_freeze, ce n'est pas une bonne idée de travailler dans le répertoire C:\Python27, et c'est d'ailleurs interdit dans les OS récents pour des raisons de sécurité: un utilisateur ne doit pas écrire là où les programmes sont installés.
    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 du Club
    Homme Profil pro
    Ingénieur calcul et simulation
    Inscrit en
    Juin 2013
    Messages
    41
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : Allemagne

    Informations professionnelles :
    Activité : Ingénieur calcul et simulation
    Secteur : Industrie

    Informations forums :
    Inscription : Juin 2013
    Messages : 41
    Points : 60
    Points
    60
    Par défaut
    Bonsoir,

    Comme tu me l'as dit, j'ai forcé l'inclusion du fichier dans la library.zip grâce à zip_includes, ce qui est très pratique et m'évite d'avoir à modifier le library.zip par la suite.

    Par contre, le problème demeure le même que quand je modifie library.zip manuellement : le fichier existe mais j'ai toujours ce même message d'erreur me disant qu'il n'est pas là ... Donc le problème est toujours là

    Pour pptx, ce n'est pas avec Tkinter, mais c'est un module qui permet de créer et modifier des Powerpoints.

    Et en effet, c'est bien dans le répertoire de python que je créé tout ça. Je vais suivre ton conseil et éviter à l'avenir

  7. #7
    Membre du Club
    Homme Profil pro
    Ingénieur calcul et simulation
    Inscrit en
    Juin 2013
    Messages
    41
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : Allemagne

    Informations professionnelles :
    Activité : Ingénieur calcul et simulation
    Secteur : Industrie

    Informations forums :
    Inscription : Juin 2013
    Messages : 41
    Points : 60
    Points
    60
    Par défaut
    En cherchant dans les fonctions du module pptx, je suis allé voir progressivement jusqu'à la dernière erreur (File "pptx\packaging.pyc", line 671, in __new__) et je vous mets ici le code de la classe en question. Peut être que le problème vient d'ici, que la fonction ne prévoit pas tous les cas de figure (notament le fait que le fichier soit dans un zip sans en être un), mais je ne suis malheureusement pas d'un niveau suffisant en Python pour le savoir :

    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
    class FileSystem(object):
        """
        Factory for filesystem interface instances.
     
        A FileSystem object provides access to on-disk package items via their URI
        (e.g. ``/_rels/.rels`` or ``/ppt/presentation.xml``). This allows parts to
        be accessed directly by part name, which for a part is identical to its
        item URI. The complexities of translating URIs into file paths or zip item
        names, and file and zip file access specifics are all hidden by the
        filesystem class. |FileSystem| acts as the Factory, returning the
        appropriate concrete filesystem class depending on what it finds at *path*.
        """
        def __new__(cls, file):
            # if *file* is a string, treat it as a path
            if isinstance(file, basestring):
                path = file
                if is_zipfile(path):
                    fs = ZipFileSystem(path)
                elif os.path.isdir(path):
                    fs = DirectoryFileSystem(path)
                else:
                    raise PackageNotFoundError("Package not found at '%s'" % path)
            else:
                fs = ZipFileSystem(file)
            return fs

  8. #8
    Membre du Club
    Homme Profil pro
    Ingénieur calcul et simulation
    Inscrit en
    Juin 2013
    Messages
    41
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : Allemagne

    Informations professionnelles :
    Activité : Ingénieur calcul et simulation
    Secteur : Industrie

    Informations forums :
    Inscription : Juin 2013
    Messages : 41
    Points : 60
    Points
    60
    Par défaut
    Une solution a été trouvée grâce à Tyrtamos

    http://www.developpez.net/forums/d13...t/#post7353926

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

Discussions similaires

  1. .BAT lance un .exe en C# avec argument
    Par Seth_75 dans le forum C#
    Réponses: 9
    Dernier message: 03/12/2010, 15h01
  2. Création d'un point .EXE sous SAS, avec paramétrage en entrée
    Par CrystalAKB dans le forum SAS AF et formulaires
    Réponses: 3
    Dernier message: 27/04/2009, 16h24
  3. csc.exe not found avec CSharpCodeProvider
    Par pcayrol dans le forum C#
    Réponses: 1
    Dernier message: 08/04/2009, 18h50
  4. pbl de temps de réponse sur un EXE en réseau avec BDE
    Par gregcat dans le forum Bases de données
    Réponses: 1
    Dernier message: 06/07/2006, 09h52
  5. pb avec deêp freeze
    Par passion_info dans le forum Autres Logiciels
    Réponses: 2
    Dernier message: 19/03/2006, 21h48

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