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: importer des modules de différents dossiers


Sujet :

Déploiement/Installation Python

Vue hybride

Message précédent Message précédent   Message suivant Message suivant
  1. #1
    Membre éclairé
    Femme Profil pro
    Ingénieur informatique scientifique
    Inscrit en
    Mai 2010
    Messages
    313
    Détails du profil
    Informations personnelles :
    Sexe : Femme
    Âge : 35
    Localisation : France

    Informations professionnelles :
    Activité : Ingénieur informatique scientifique
    Secteur : Aéronautique - Marine - Espace - Armement

    Informations forums :
    Inscription : Mai 2010
    Messages : 313
    Par défaut Cx_freeze: importer des modules de différents dossiers
    Bonjour,

    Après avoir regardé du côté de pyInstaller j'ai décidé de m'intéresser aussi à cx_freeze pour créer un exécutable à partir de mon appli python.
    Je me suis servi du modèle de Tyrtamos, mais je ne comprends pas comment faire pour la variable "includes".

    En effet l'arborescence de mon appli est la suivante:

    main.py
    GestionEvenements
    • __init__.py
    • onglet1.py
    • onglet2.py
    • onglet3.py
    • onglet4.py
    • sousFenetre1.py
    • sousFenetre2.py


    AutresModules
    • __init__.py
    • autreModule1.py
    • autreModule2.py
    • autreModule3.py


    IHM
    • __init__.py
    • Fenetre1
      • __init__.py
      • Fenetre1.py
      • Fenetre1.ui
      • ressources_rc.py
    • Fenetre2
      • __init__.py
      • Fenetre2.py
      • Fenetre2.ui
      • ressources_rc.py


    J'ai ajouté les dossiers "IHM", "AutresModules" et "GestionEvenements" au path (avec sys.path.append), mais je ne vois pas comment faire pour le "includes", car dans son exemple Tyrtamos indique qu'il utilise deux modules présents dans un dossier "biblios":

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    [*]includes = ["printx", "bibconcours"]
    Mais comment faire lorsque ces modules proviennent de différents dossiers?
    Merci d'avance pour votre aide.

  2. #2
    Invité
    Invité(e)
    Par défaut
    Citation Envoyé par mokochan Voir le message
    Bonjour,

    Après avoir regardé du côté de pyInstaller j'ai décidé de m'intéresser aussi à cx_freeze pour créer un exécutable à partir de mon appli python.
    Je me suis servi du modèle de Tyrtamos, mais je ne comprends pas comment faire pour la variable "includes".

    En effet l'arborescence de mon appli est la suivante:

    main.py
    GestionEvenements
    • __init__.py
    • onglet1.py
    • onglet2.py
    • onglet3.py
    • onglet4.py
    • sousFenetre1.py
    • sousFenetre2.py


    AutresModules
    • __init__.py
    • autreModule1.py
    • autreModule2.py
    • autreModule3.py


    IHM
    • __init__.py
    • Fenetre1
      • __init__.py
      • Fenetre1.py
      • Fenetre1.ui
      • ressources_rc.py
    • Fenetre2
      • __init__.py
      • Fenetre2.py
      • Fenetre2.ui
      • ressources_rc.py


    J'ai ajouté les dossiers "IHM", "AutresModules" et "GestionEvenements" au path (avec sys.path.append), mais je ne vois pas comment faire pour le "includes", car dans son exemple Tyrtamos indique qu'il utilise deux modules présents dans un dossier "biblios":

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    [*]includes = ["printx", "bibconcours"]
    Mais comment faire lorsque ces modules proviennent de différents dossiers?
    Merci d'avance pour votre aide.
    Bonjour,

    Je suppose que vous voulez parler de ce qui se trouve ici : 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
    #!/usr/bin/python
    # -*- coding: utf-8 -*-
     
    # source d'inspiration: http://wiki.wxpython.org/cx_freeze
     
    import sys, os
    from cx_Freeze import setup, Executable
     
    #############################################################################
    # preparation des options 
    path = sys.path.append(os.path.join("..", "..", "biblio"))
    includes = ["printx", "bibconcours"]
    excludes = []
    packages = []
     
    options = {"path": path,
               "includes": includes,
               "excludes": excludes,
               "packages": packages
               }
     
    #############################################################################
    # preparation des cibles
    base = None
    if sys.platform == "win32":
        base = "Win32GUI"
     
    cible_1 = Executable(
        script = "test.py",
        base = base,
        compress = True,
        icon = None,
        )
     
    cible_2 = Executable(
        script = "test2.py",
        base = base,
        compress = True,
        icon = None,
        )
     
    #############################################################################
    # creation du setup
    setup(
        name = "test_cx_freeze",
        version = "0.1",
        description = "simple test de cx_freeze avec PyQt4",
        author = "Tyrtamos",
        options = {"build_exe": options},
        executables = [cible_1, cible_2]
        )
    Pour ma part, je n'utilise pas cx_Freeze (je dév uniquement linux), mais la simple déduction me ferait dire que pour votre cas, cela se passe ici :

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    # preparation des options 
    path = sys.path   #.append(os.path.join("..", "..", "biblio"))
    includes = []
    excludes = []
    packages = ["GestionEvenements", "AutresModules", "IHM"]
     
    options = {"path": path,
               "includes": includes,
               "excludes": excludes,
               "packages": packages
               }
    et pour l'exécutable :

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    # preparation des cibles
    base = None
    if sys.platform == "win32":
        base = "Win32GUI"
     
    cible_1 = Executable(
        script = "main.py",
        base = base,
        compress = True,
        icon = None,
        )
    et enfin pour le setup :

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
     
    #############################################################################
    # creation du setup
    setup(
        name = "mon_programme",
        version = "0.1",
        description = "mon programme fait ceci cela",
        author = "moi",
        options = {"build_exe": options},
        executables = [cible_1]
        )
    En tout cas, je verrais bien ça comme ça.

    @+.

  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,

    Je suis d'accord avec la réponse de tarball69: puisque les modules du programme sont intégrés dans des packages, il faut les déclarer avec l'option packages.

    Ce que fait cx_freeze est compliqué, et la notice n'est pas terrible: il faut tâtonner un peu. Avec la structure du programme tel que définie, je commencerais avec path (path = sys.path) et includes (includes = []) sans changement, et je ne complèterais que s'il y a des erreurs dans le traitement par cx_freeze. Par exemple, avec de gros programmes PyQt4, j'ai initialisé includes = ["sip", "atexit"] grâce au rapport d'erreurs de cx_freeze.

    A noter que le lien cité sur mon site web est le 1er tuto que j'avais fait sur cx_freeze en 2010. J'ai fait depuis 2 autres tutos appliqués à des programmes utilisant la bibliothèque graphique PyQt4 sous Windows (http://python.jpvweb.com/mesrecettes..._pyqt4_windows) et sous Linux (http://python.jpvweb.com/mesrecettes...ze_pyqt4_linux). D'année en année, mon setup "modèle" se complète en fonction de ma pratique. J'ai ainsi ajouté au moins 2 options intéressantes:

    - l'option include_files qui permet de copier des fichiers ou des répertoires qui ne sont pas copiés automatiquement par cx_freeze. En fait, cx_freeze copie facilement les fichiers .py et .pyw mais pas les autres. Par exemple, les fichiers des icones, ou des répertoires de pilotes de SGBDR ou de fichiers du système de traduction. Particularité de cette option, on peut nommer simplement un nom de fichier, mais on peut aussi préciser dans un tuple l'adresse source absolue et l'adresse destination relative: on peut donc changer la structure des éléments, et même demander que certains fichiers soient renommés pendant la copie.

    - l'option include_msvcr qui permet à cx_freeze sous Windows, de recopier automatiquement les dll de windows. Cela évite au logiciel sous forme .exe de se planter quand on change de PC et de version de Windows.

    Il y a d'autres options que j'utilise maintenant dans des cas plus rares, inutiles ici.

    Voilà donc le setup que je ferais pour le programme présenté ici. J'en reste à ma logique: je laisse volontairement les options inutiles vides, et je complète mon modèle au fur et à mesure.

    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
    #!/usr/bin/python
    # -*- coding: utf-8 -*-
    # Python 2.7
     
    """
    NB: Pas d'accent dans le setup, ni dans la description, ni dans les commentaires
     
    Icone sous Windows: il faut:
    => xxx.ico pour integration dans le exe, avec "icon=xxx.ico"
    => xxx.png pour integration dans le graphique + demander copie avec includefiles.
    """
     
    import sys, os
    from cx_Freeze import setup, Executable
     
    #############################################################################
    # preparation des options
     
    # chemins de recherche des modules
    path = sys.path
     
    # options d'inclusion/exclusion des modules
    includes = []
    excludes = []
     
    # option d'inclusion des packages
    packages = ["GestionEvenements", "AutresModules", "IHM"]
     
    # copier les fichiers non-py et non-pyw et/ou repertoires et leur contenu:
    includefiles = []
     
    # inclure si nécessaire les fichiers non-py et non-pyw dans library.zip
    zipincludes = []
     
    # pour que certaines bibliotheques "systeme" soient recopiees aussi
    binpathincludes = []
    if sys.platform == "linux2":
        binpathincludes += ["/usr/lib"]
     
    # construction du dictionnaire des options
    options = {"path": path,
               "includes": includes,
               "excludes": excludes,
               "packages": packages,
               "include_files": includefiles,
               "zip_includes": zipincludes,
               "bin_path_includes": binpathincludes,
               "create_shared_zip": True,
               "include_in_shared_zip": True,
               "compressed": False
               }
     
    # 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":
        base = "Win32GUI" # pour des programmes graphiques sous Windows
        #base = "Console" # pour des programmes en console sous Windows
     
    icone = None
    if sys.platform == "win32":
        icone = None # mettre ici le fichier de l' icone .ico pour integration a l'exe
     
    cible_1 = Executable(
        script = "main.py",
        base = base,
        compress = False,
        copyDependentFiles = True,
        appendScriptToExe = True,
        appendScriptToLibrary = False,
        icon = icone
        )
     
    #############################################################################
    # creation du setup
    setup(
        name = "mon_programme",
        version = "1",
        description = "mon_programme .....",
        author = "mokochan",
        options = {"build_exe": options},
        executables = [cible_1]
        )
    Après ce 1er jet, je regarde soigneusement les erreurs de traitement pour corriger le setup (et quelquefois le code lui-même). A noter que certains "warnings" peuvent être non corrigés sans empêcher le programme de fonctionner. Et il est sage d'essayer de lancer ensuite le programme exe dans la console cmd.exe car certains messages ne sont affichés que dans ces conditions.

    A noter que si je travaille le plus souvent sous Windows, cx_freeze fonctionne aussi sous Linux (exécutable ou paquet rpm), et sous Mac OS X (exécutable ou image disque .dmg). Par contre, on ne fait pas de "cross-traitement": l'exécutable sous un OS se construit avec cet OS.

  4. #4
    Expert éminent
    Homme Profil pro
    Architecte technique retraité
    Inscrit en
    Juin 2008
    Messages
    21 679
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Manche (Basse Normandie)

    Informations professionnelles :
    Activité : Architecte technique retraité
    Secteur : Industrie

    Informations forums :
    Inscription : Juin 2008
    Messages : 21 679
    Par défaut
    Salut,

    Citation Envoyé par tyrtamos Voir le message
    Ce que fait cx_freeze est compliqué, et la notice n'est pas terrible: il faut tâtonner un peu. Avec la structure du programme tel que définie, je commencerais avec path (path = sys.path) et includes (includes = []) sans changement, et je ne complèterais que s'il y a des erreurs dans le traitement par cx_freeze. Par exemple, avec de gros programmes PyQt4, j'ai initialisé includes = ["sip", "atexit"] grâce au rapport d'erreurs de cx_freeze.

    Vous avez tout un chapitre dans la documentation Python sur "distributing Python modules" et des tonnes de tutoriels sur ce sujet.
    distutils est compliqué : satisfaire les différents besoins des développeurs d'application Python sans leur imposer une organisation "rigide" ne peut pas être simple.

    cx_freeze étant une extension de distutils ne documente que les spécificités cx_freeze.
    DRY vaut aussi pour la documentation.

    - W
    Architectures post-modernes.
    Python sur DVP c'est aussi des FAQs, des cours et tutoriels

  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
    Bonjour,

    Merci de ce rappel, wiztricks. Effectivement, je n'ai pas toujours le réflexe de consulter la doc de distutils (mais ce truc est une usine à gaz... ).

  6. #6
    Expert éminent
    Homme Profil pro
    Architecte technique retraité
    Inscrit en
    Juin 2008
    Messages
    21 679
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Manche (Basse Normandie)

    Informations professionnelles :
    Activité : Architecte technique retraité
    Secteur : Industrie

    Informations forums :
    Inscription : Juin 2008
    Messages : 21 679
    Par défaut
    Citation Envoyé par tyrtamos Voir le message
    Merci de ce rappel, wiztricks. Effectivement, je n'ai pas toujours le réflexe de consulter la doc de distutils (mais ce truc est une usine à gaz... ).
    Oui et non.
    Les complications dépendent de la structure de l'application (ou sont posés les fichiers vs. setup.py)
    Si vous vous appliquez à garder la même structure, le boulot déjà fait sera réutilisable.

    Les gros soucis sont lorsque vous avez développé une application avec une structure pas trop alignées avec les attentes de distutils.
    Dans ce cas, il faut s'embourber à dépiauter la doc ou revoir l'organisation du code.

    Mais si vous partez en disant je vais avoir besoin de 2/3 packages puis de... comment organiser un truc pareil pour que ce soit facile à packager?
    Soit on a déjà un projet "semblable", soit on "teste" comment organiser la structure du projet "à blanc".
    Dans tous les cas, on a un canevas qui évitera de ramer a essayer de rafistoler le truc à la fin.

    - W
    Architectures post-modernes.
    Python sur DVP c'est aussi des FAQs, des cours et tutoriels

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

Discussions similaires

  1. Importer des Documents depuis un dossier
    Par fredlang dans le forum Développement Sharepoint
    Réponses: 3
    Dernier message: 20/10/2010, 09h36
  2. importation des modules
    Par mzarou dans le forum VBA Access
    Réponses: 2
    Dernier message: 16/03/2009, 11h30
  3. Import des modules inclus dans PyQt4
    Par VinsS dans le forum PyQt
    Réponses: 1
    Dernier message: 20/10/2008, 15h54
  4. [Formulaire] intégrer des images de différents dossiers
    Par julien_t_m dans le forum Access
    Réponses: 2
    Dernier message: 16/10/2005, 20h57

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