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

  1. #1
    Membre averti
    Femme Profil pro
    Ingénieur informatique scientifique
    Inscrit en
    Mai 2010
    Messages
    313
    Détails du profil
    Informations personnelles :
    Sexe : Femme
    Âge : 34
    Localisation : France

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

    Informations forums :
    Inscription : Mai 2010
    Messages : 313
    Points : 301
    Points
    301
    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 é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,

    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.
    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

  4. #4
    Expert éminent sénior
    Homme Profil pro
    Architecte technique retraité
    Inscrit en
    Juin 2008
    Messages
    21 287
    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 287
    Points : 36 776
    Points
    36 776
    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 é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,

    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... ).
    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
    Expert éminent sénior
    Homme Profil pro
    Architecte technique retraité
    Inscrit en
    Juin 2008
    Messages
    21 287
    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 287
    Points : 36 776
    Points
    36 776
    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

  7. #7
    Membre averti
    Femme Profil pro
    Ingénieur informatique scientifique
    Inscrit en
    Mai 2010
    Messages
    313
    Détails du profil
    Informations personnelles :
    Sexe : Femme
    Âge : 34
    Localisation : France

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

    Informations forums :
    Inscription : Mai 2010
    Messages : 313
    Points : 301
    Points
    301
    Par défaut
    Merci pour vos réponses!
    J'ai oublié de préciser, je travaille sous Linux (CentOS 5).

    En effet cela a l'air de fonctionner en utilisant la variable "packages".
    J'ai ensuite essayé de lancer l'exécutable et modifié le setup.py en fonction des messages d'erreur que j'avais.
    J'ai notamment ajouté "lxml._elementpath", "scipy.sparse.csgraph._validation" et "scipy.io.matlab.streams" à la variable includes.

    Cependant je me heurte à un nouveau problème, le truc c'est que apparemment ça vient du code du module Scipy...
    Je m'explique: le build ("python setup.py build) fonctionnait mais en lançant l'exécutable j'avais le message d'erreur suivant:

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    File "/usr/local/lib/python2.7/site-packages/guidata/configtools.py", line 86, in add_image_path
    for fileobj in os.listdir(path):
    OSError: [Errno 20] Not a directory: '/home/user/monAppli/build/exe.linux-i686-2.7/library.zip/guidata/images'
    En effet cela paraît normal que ce soit "not a directory", étant donné que "/home/user/tmp/dist/library.zip" est un fichier!
    J'ai cherché sur le net et j'ai trouvé un post d'une personne ayant eu exactement le même problème, et qui l'a "corrigé" en modifiant directement le fichier "guidata/configtools.py" car il y avait un bug sous Linux...
    Le lien du post en question: post

    J'ai testé sa solution et effectivement cela a fonctionné. Cependant quelques lignes plus loin je me retrouve maintenant avec une erreur similaire sur un autre fichier du module Scipy:
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    File "/usr/local/lib/python2.7/site-packages/scipy/io/matlab/mio.py", line 78, in _open_file
        return open(full_name, 'rb')
    IOError: [Errno 20] N'est pas un répertoire: '/home/user/monAppli/build/exe.linux-i686-2.7/library.zip/IHM/Images/ficMatlab/sphere.mat'
    Encore une fois il utilise un chemin comportant le fichier "library.zip" au lieu de s'arrêter au répertoire "exe.linux-i686-2.7"...
    Je n'ai pas trop envie de m'amuser à modifier le code des fichiers python du module scipy...

    De plus je ne comprend pas trop, pourquoi je n'avais pas cette erreur avant, quand j'exécute mon appli python avec l'interpréteur python (pas le fichier exécutable)?
    Avez-vous déjà vu ce genre de bug, et si oui aviez-vous réussi à le corriger?
    Merci d'avance

  8. #8
    Invité
    Invité(e)
    Par défaut
    Merci de cliquer si votre problème a trouvé réponse ou si cette discussion est close.

    @+.

  9. #9
    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,

    Concernant le dernier problème, il me semble avoir déjà rencontré ça avec library.zip.

    cx_freeze semble mettre le maximum de modules et de package dans ce zip. Une des particularités, c'est que les éventuels fichiers non-py (une icone par exemple) ne sont pas recopiés au même endroit. Mais même si on les recopie à la main, ça ne marche toujours pas. Pourquoi? Parce que lors de son exécution, le module du library.zip est tiré du zip et cherche l’icône mais ne le trouve pas à cause du chemin qui passe par library.zip et qui est faux.

    La solution est assez simple:
    ==> on empêche la création du library.zip avec les options suivantes (relativement avec mon setup.py modèle):

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    options = {"path": path,
               "includes": includes,
               "excludes": excludes,
               "packages": packages,
               "include_files": includefiles,
               "zip_includes": zipincludes,
               "bin_path_includes": binpathincludes,
               "create_shared_zip": False,                <===
               "include_in_shared_zip": False,            <===
               "compressed": False                          <===
               }
    Et la définition de la cible:

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    cible_1 = Executable(
        script = "main.py",
        base = base,
        compress = False,
        copyDependentFiles = True,
        appendScriptToExe = True,
        appendScriptToLibrary = False,      <===
        icon = icone
        )
    Après traitement par cx_freeze, on constate effectivement que library.zip a disparu: ce qui me parait beaucoup plus clair à comprendre.

    Regarde si ça résout ton problème.
    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

  10. #10
    Expert éminent sénior
    Homme Profil pro
    Architecte technique retraité
    Inscrit en
    Juin 2008
    Messages
    21 287
    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 287
    Points : 36 776
    Points
    36 776
    Par défaut
    Citation Envoyé par tyrtamos Voir le message
    Concernant le dernier problème, il me semble avoir déjà rencontré ça avec library.zip.

    cx_freeze semble mettre le maximum de modules et de package dans ce zip. Une des particularités, c'est que les éventuels fichiers non-py (une icone par exemple) ne sont pas recopiés au même endroit. Mais même si on les recopie à la main, ça ne marche toujours pas. Pourquoi? Parce que lors de son exécution, le module du library.zip est tiré du zip et cherche l’icône mais ne le trouve pas à cause du chemin qui passe par library.zip et qui est faux.
    Le répertoire "racine" de l'application à partir duquel on va pouvoir trouver des fichiers externes "bouge".
    L'application doit traiter différemment "je suis lancé dans le contexte cx_Freeze ou non".

    Pour le détecter et y pallier, est documenté:
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    #TODO: find data files this way. 
    def find_data_file(filename):
        if getattr(sys, 'frozen', False): # ici, attribut magique
            # The application is frozen
            datadir = os.path.dirname(sys.executable)
        else:
            # The application is not frozen
            # Change this bit to match where you store your data files:
            datadir = os.path.dirname(__file__)
     
        return os.path.join(datadir, filename)
    le "datadir" sera renseigné en fonction du cas et utilisable pour accéder aux fichiers externes relatifs.

    Et cela devrait fonctionner que setup.py emballe ou pas le projet dans un .zip.
    C'est une décision à prendre en fonction du type de packaging (rpm, win,...).
    Et à cette étape là, on doit pouvoir packager comme on veut sans avoir à modifier le code de l'application.

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

  11. #11
    Membre averti
    Femme Profil pro
    Ingénieur informatique scientifique
    Inscrit en
    Mai 2010
    Messages
    313
    Détails du profil
    Informations personnelles :
    Sexe : Femme
    Âge : 34
    Localisation : France

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

    Informations forums :
    Inscription : Mai 2010
    Messages : 313
    Points : 301
    Points
    301
    Par défaut
    Merci pour toutes vos réponses,
    cela a fonctionné avec ta solution Tyrtamos!
    Merci à vous

+ 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