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

Py2exe Python Discussion :

Importlib et py2exe / cxfreeze [Python 3.X]


Sujet :

Py2exe Python

  1. #1
    Candidat au Club Avatar de xoxotf
    Homme Profil pro
    Recherche d'emploi
    Inscrit en
    Mars 2016
    Messages
    7
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Yvelines (Île de France)

    Informations professionnelles :
    Activité : Recherche d'emploi
    Secteur : Bâtiment

    Informations forums :
    Inscription : Mars 2016
    Messages : 7
    Points : 2
    Points
    2
    Par défaut Importlib et py2exe / cxfreeze
    Salut,

    J'ai un programme python qui marche parfaitement via la console, mais une fois compilé avec py2exe, cxfreeze ou même pyinstaller j'ai un module qui ne fonctionne plus et rend donc mon programme obsolète. Le module en question est "importlib". Je l'utilise pour pouvoir importer dynamiquement un module c'est à dire comme en php pouvoir faire un include du genre :

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    $var = "NomDuModule";
    include($var);
    Le soucis c'est puisque ça ne fonctionne pas, il me retourne un string et non un objet et donc a l'appelle de ce dernier j'ai une erreur.

    voici la déclaration:

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    idm = cc.GetModule("idmantypeinfo.tlb")
    name = str(idm)
    module = name[9:65]
    IDMan = importlib.import_module(module)
    La dernière ligne est celle qui me fait défaut, et qui et donc l'équivalent (en non-dynamique) de :

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    import comtypes.gen._ECF21EAB_3AA8_4355_82BE_F777990001DD_0_1_0 as IDMan
    Comme vous pouvez vous en douter, c'est le UUID que je doit récupérer, d'ou ma manoeuvre puisque évidemment il et unique sur chaque pc.
    Et donc à l'appelle de IDMan via la console tout marche parfaitement mais une fois compiler l'appelle de IDMan me donne une erreur puisque ce n'est plus un objet:

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    idm1 = cc.CreateObject("IDMan.CIDMLinkTransmitter", None, None, IDMan.ICIDMLinkTransmitter2)
    Mon soucis est donc de réussir à faire un executable avec un module importlib fonctionnel. Après plusieurs recherche je n'arrive pas à trouver ma réponse, même en modifiant les différents setup.py pour include manuellement le module avant compilation cela ne change rien j'ai toujours le même soucis. Je m'en remet donc à vous

  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,

    Je viens d'essayer un petit code:

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    import importlib
     
    modul = importlib.import_module("sys", package=None)
     
    print(modul.platform) # doit afficher "win32" sous Windows
    L'exécution de ce code python affiche bien "win32".

    Je fais le traitement avec cx_freeze avec un setup.py qui n'a aucune instruction spécifique pour importlib, et l'exécution de l'exe fait ce qu'il doit faire: il affiche bien "win32"!

    Est-ce que ça fait la même chose chez toi?
    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
    Candidat au Club Avatar de xoxotf
    Homme Profil pro
    Recherche d'emploi
    Inscrit en
    Mars 2016
    Messages
    7
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Yvelines (Île de France)

    Informations professionnelles :
    Activité : Recherche d'emploi
    Secteur : Bâtiment

    Informations forums :
    Inscription : Mars 2016
    Messages : 7
    Points : 2
    Points
    2
    Par défaut
    Oui j'ai bien win32 qui s'affiche (après avoir compiler avec cx). Enfaite pour être plus précis, j'utilise le module comtypes.client qui permet d'accéder à une interface COM, après avoir utilisé la méthode GetModule() je récupère en string l'UUID du module COM, identifiant necessaire pour importer le module correspondant (car le nom change en fonction de l'UUID). J'essaye ensuite de l'importer grâce à importlib mais une fois compilé, ça ne fonctionne plus..

  4. #4
    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
    Et à titre d'essai, est-ce que le module qui ne s'importe pas avec importlib peut-il être importé de façon classique avec import?
    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

  5. #5
    Candidat au Club Avatar de xoxotf
    Homme Profil pro
    Recherche d'emploi
    Inscrit en
    Mars 2016
    Messages
    7
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Yvelines (Île de France)

    Informations professionnelles :
    Activité : Recherche d'emploi
    Secteur : Bâtiment

    Informations forums :
    Inscription : Mars 2016
    Messages : 7
    Points : 2
    Points
    2
    Par défaut
    Eh bien étrangement non, je ne suis pas expert mais j'ai au début avant importlib tenter de cette manière:
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    IDMan = __import__(module)
    mais au lieu d'importer cela :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    import comtypes.gen._ECF21EAB_3AA8_4355_82BE_F777990001DD_0_1_0 as IDMan
    j'ai ceci :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    <module 'comtypes' from 'C:\\Python34\\lib\\site-packages\\comtypes\\__init__.py'>
    J'ai donc déduit que l'import c'était bizarrement arrêter au premier ".", mais le comment du pourquoi je ne sais pas, après ça j'ai découvert importlib qui fonctionner parfaitement bien, excepter après compilation

  6. #6
    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
    Est-ce que "comtypes" est un répertoire dans lequel il y a un fichier "__init__.py" même vide?
    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

  7. #7
    Candidat au Club Avatar de xoxotf
    Homme Profil pro
    Recherche d'emploi
    Inscrit en
    Mars 2016
    Messages
    7
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Yvelines (Île de France)

    Informations professionnelles :
    Activité : Recherche d'emploi
    Secteur : Bâtiment

    Informations forums :
    Inscription : Mars 2016
    Messages : 7
    Points : 2
    Points
    2
    Par défaut
    Enfaite, GetModule genere un module depuis un type libraries (je ne connais pas la traduction), expliquer ici : http://starship.python.net/crew/thel...#typelibraries

    Et oui il y a bien un fichier __init__ mais absolument pas vide, mais je dirais comme tout module il y à un fichier __init__ (il me semble ?)

  8. #8
    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
    Essaie avec:

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    from comtypes.gen import _ECF21EAB_3AA8_4355_82BE_F777990001DD_0_1_0 as IDMan
    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

  9. #9
    Candidat au Club Avatar de xoxotf
    Homme Profil pro
    Recherche d'emploi
    Inscrit en
    Mars 2016
    Messages
    7
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Yvelines (Île de France)

    Informations professionnelles :
    Activité : Recherche d'emploi
    Secteur : Bâtiment

    Informations forums :
    Inscription : Mars 2016
    Messages : 7
    Points : 2
    Points
    2
    Par défaut
    Ca fonctionnera de cette façon mais ce n'est pas ce que je recherche puisque du coup mon programme n'est plus dynamique il ne marchera que sur mon pc puisque l'UUID est unique, c'est pourquoi j'utilise importlib parce que je peux extraire l'UUID pour l'utiliser dans l'import du module generer par comtypes.client.

    comtypes.client genere un module quand on utilise la methode GetModule(), mais le nom de ce module généré est unique puisqu'il porte le nom du module + l'UUID de la librairie contenu sur le pc de l'utilisateur donc impossible d'importer le module normalement, d'ou l'utilisation d'importlib.

  10. #10
    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
    Autre piste.

    Dans le setup.py de cx_freeze, essaie avec l'option package contenant: ["comtypes"].
    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

  11. #11
    Candidat au Club Avatar de xoxotf
    Homme Profil pro
    Recherche d'emploi
    Inscrit en
    Mars 2016
    Messages
    7
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Yvelines (Île de France)

    Informations professionnelles :
    Activité : Recherche d'emploi
    Secteur : Bâtiment

    Informations forums :
    Inscription : Mars 2016
    Messages : 7
    Points : 2
    Points
    2
    Par défaut
    Même résultat, j'ai déjà essayer avec importlib aussi, voici mon setup:
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
     
    from cx_Freeze import setup, Executable
     
    build_exe_options = {"packages": ["comtypes"]}
     
    setup(
        name = "standalone",
        version = "0.1",
        description = "Single link",
        executables = [Executable("xtest.py")],
    )

  12. #12
    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
    Il faut lier les options dans le setup, sinon ça ne sert à rien:

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    from cx_Freeze import setup, Executable
     
    build_exe_options = {"packages": ["comtypes"]}
     
    setup(
        name = "standalone",
        version = "0.1",
        description = "Single link",
        options = {"build_exe": build_exe_options},
        executables = [Executable("xtest.py")],
    )
    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

  13. #13
    Candidat au Club Avatar de xoxotf
    Homme Profil pro
    Recherche d'emploi
    Inscrit en
    Mars 2016
    Messages
    7
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Yvelines (Île de France)

    Informations professionnelles :
    Activité : Recherche d'emploi
    Secteur : Bâtiment

    Informations forums :
    Inscription : Mars 2016
    Messages : 7
    Points : 2
    Points
    2
    Par défaut
    Effectivement... problème résolu
    Merci tyrtamos pour ton aide, au final et comme toujours c'est tout le temps les fautes d'inattention qui revienne le plus souvent

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

Discussions similaires

  1. [py2exe] wxPython et py2exe -> pb de rendu
    Par bibile dans le forum Py2exe
    Réponses: 7
    Dernier message: 14/06/2008, 19h02
  2. [PyQt] [py2exe]
    Par Zorro dans le forum Py2exe
    Réponses: 2
    Dernier message: 05/05/2006, 13h36
  3. [py2exe] Impossible de charger un module...
    Par Mr Hyde dans le forum Py2exe
    Réponses: 3
    Dernier message: 28/09/2005, 17h17
  4. [py2exe] Creation Py2Exe
    Par kedare dans le forum Py2exe
    Réponses: 8
    Dernier message: 15/09/2005, 12h50
  5. wxPython + MatPlotLib + py2exe
    Par bibile dans le forum Py2exe
    Réponses: 1
    Dernier message: 05/08/2005, 22h49

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