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 :

py2exe/Anaconda - DLL issues


Sujet :

Py2exe Python

  1. #1
    Membre éprouvé

    Homme Profil pro
    Ingénieur
    Inscrit en
    Août 2010
    Messages
    654
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France

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

    Informations forums :
    Inscription : Août 2010
    Messages : 654
    Points : 1 150
    Points
    1 150
    Par défaut py2exe/Anaconda - DLL issues
    Bonjour,

    Je me tire les cheveux depuis plusieurs heures sur un problème avec py2exe et Anaconda. Je cherche à packager un programme python 2.7 qui fait appel à des bibliothèques de fonctions orientées maths (numpy, scipy, etc...). J'ai déjà réussi à faire cela il y a quelques temps, mais je développais en utilisant le bundle python(x,y). Depuis je suis passé sur Anaconda pour être en 64 bits.

    Bref, là n'est pas le problème. Voici mon programme test:
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    # main.py
    import Tkinter
    import numpy
    import pandas
    import matplotlib
    import scipy
    import os, sys
    Voici mon setup.py:
    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
    # -*- coding: utf-8 -*-
     
    from distutils.core import setup
    import py2exe, sys, os
    import numpy as np
    import matplotlib
     
    sys.setrecursionlimit(5000)
     
    sys.path.append(os.getcwd())
    import main
     
    # Patch to solve tkinter dll copying issue with py2exe
    py2exe.build_exe.py2exe.old_prepare = py2exe.build_exe.py2exe.plat_prepare
    def new_prep(self):
        self.old_prepare()
        from _tkinter import TK_VERSION, TCL_VERSION
        self.dlls_in_exedir.append('tcl{0}.dll'.format(TCL_VERSION.replace('.','')))
        self.dlls_in_exedir.append('tk{0}.dll'.format(TK_VERSION.replace('.','')))
    py2exe.build_exe.py2exe.plat_prepare = new_prep
     
    # List of stuff wich need to be included (not handled automatically by 
    # py2exe
    includes = ['sip',
                'matplotlib.backends',
                'matplotlib.figure',
                'pylab',
                'numpy',
                'numpy.linalg',
                'scipy.sparse.csgraph._validation',
                'scipy.special._ufuncs_cxx',
                'matplotlib.backends.backend_tkagg',
                'matplotlib.backends.backend_qt4agg',
                'FileDialog']
     
    # List of stuff which can be excluded to get a lighter executable
    excludes = ['_gtkagg',
                '_agg2',
                '_cairo', 
                '_cocoaagg',
                '_fltkagg',
                '_gtk',
                '_gtkcairo',
                '_ssl',
                'pdb']
     
    # List of not usefull dlls
    dll_excludes = ['libgdk-win32-2.0-0.dll',
                    'libgobject-2.0-0.dll']
     
    data_files = []
    data_files.extend(matplotlib.get_py2exe_datafiles())
     
    # List of scripts of the program
    scripts = ['main.py']
     
    # Py2exe options
    opt = {'py2exe': {'compressed': False, 
                      'optimize': 2,
                      'includes': includes,
                      'excludes': excludes,
                      'dll_excludes': dll_excludes,
                      'bundle_files': 3,
                      'dist_dir': 'bin',
                      'xref': False,
                      'skip_archive': False,
                      'ascii': False,
                      'custom_boot_script': '',
                     }
            }
     
    setup(
        name = 'test',
        scripts = scripts,
        windows = [{'script': 'main.py',
                    'dest_base': 'main',
                    'icon_ressources': None}],
        data_files = data_files,
        options = opt,
        )
    Mon environnement de travail:
    platform : win-64
    conda version : 3.19.3
    conda-build version : 1.19.0
    python version : 2.7.11.final.0
    requests version : 2.9.1
    root environment : C:\users-apps\Anaconda2 (writable)
    default environment : C:\users-apps\Anaconda2
    envs directories : C:\users-apps\Anaconda2\envs
    package cache : C:\users-apps\Anaconda2\pkgs
    channel URLs : https://repo.continuum.io/pkgs/free/win-64/
    https://repo.continuum.io/pkgs/free/noarch/
    https://repo.continuum.io/pkgs/pro/win-64/
    https://repo.continuum.io/pkgs/pro/noarch/
    config file : None
    is foreign system : False
    J'utilise la version 0.6.10 de py2exe. Le packaging se passe plutôt bien, mais lorsque j'essaye de lancer l’exécutable créé ça plante. Le log m'indique ceci:
    Traceback (most recent call last):
    File "main.py", line 1, in <module>
    File "numpy\__init__.pyo", line 172, in <module>
    File "numpy\add_newdocs.pyo", line 13, in <module>
    File "numpy\lib\__init__.pyo", line 18, in <module>
    File "numpy\lib\polynomial.pyo", line 19, in <module>
    File "numpy\linalg\__init__.pyo", line 51, in <module>
    File "numpy\linalg\linalg.pyo", line 29, in <module>
    File "numpy\linalg\lapack_lite.pyo", line 12, in <module>
    File "numpy\linalg\lapack_lite.pyo", line 10, in __load
    ImportError: DLL load failed: La procédure spécifiée est introuvable.
    Toutes mes recherches n'ont rien données. Je peux reproduire ce problème chez tous les utilisateurs destinataire du programme ayant la même config que moi, ainsi que ceux n'ayant pas du tout python installé.

    Est-ce que quelqu'un ici voit ce qui pourrait être à l'origine du problème?

    Julien

  2. #2
    Membre éprouvé

    Homme Profil pro
    Ingénieur
    Inscrit en
    Août 2010
    Messages
    654
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France

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

    Informations forums :
    Inscription : Août 2010
    Messages : 654
    Points : 1 150
    Points
    1 150
    Par défaut
    Je ne suis toujours pas parvenu à corriger ce problème, mais apparemment je ne serais pas le seul dans ce cas. C'est bug un remonté auprès de Continuum (qui produit la le package Anaconda). Donc Je laisse provisoirement de côté ce soucis. Dès que j'aurais la solution je passerais l'indiquer ici.

    En attendant, je me suis orienté vers la solution de distribution détaillée ici creation-utilisation-version-portable-python-pour-windows. Le tuto n'est pas super complet ni très à jour mais la solution proposée fonctionne bien. Je sais qu'ici certaines personnes utilisent portablepython, mais leur site indique que cette solution n'est plus maintenue.

    Ciao

  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,

    Au lieu de py2exe, il y a aussi cx_freeze qui fait la même chose avec en plus des possibilités en multiplateformes (Windows, Linux et Mac OS X). J'ai déjà rencontré aussi des problèmes avec les modules scientifiques, mais il y a des solutions qu'on découvre à coup d'essais/erreurs... Il faut une bonne méthode de travail pour ça, et en particulier passer par un setup.py pour pouvoir lui ajouter petit à petit les modules que le programme de traitement ne trouve pas tout seul.

    Sous Windows, il y a aussi winpython (http://winpython.github.io/) qui marche très bien en tant que python portable. C'est ce que j'utilise quand j'en ai besoin.
    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
    Membre à l'essai
    Femme Profil pro
    Assistant aux utilisateurs
    Inscrit en
    Mars 2014
    Messages
    11
    Détails du profil
    Informations personnelles :
    Sexe : Femme
    Localisation : France, Val de Marne (Île de France)

    Informations professionnelles :
    Activité : Assistant aux utilisateurs
    Secteur : Finance

    Informations forums :
    Inscription : Mars 2014
    Messages : 11
    Points : 15
    Points
    15
    Par défaut pyinstaller
    Hellooo

    Personnellement j'en ai eu des prises de têtes avec les compilateurs !! Je suis sous Windows 7 et PyInstaller 2.1 est passé comme une lettre à la poste !!!

    Le temps de piger comment cela fonctionne mais une fois rodé c'est tout bon !!!

  5. #5
    Membre éprouvé

    Homme Profil pro
    Ingénieur
    Inscrit en
    Août 2010
    Messages
    654
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France

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

    Informations forums :
    Inscription : Août 2010
    Messages : 654
    Points : 1 150
    Points
    1 150
    Par défaut
    Citation Envoyé par tyrtamos Voir le message
    Au lieu de py2exe, il y a aussi cx_freeze
    Effectivement. Avant de m'être essayé à py2exe j'utilisait cx_freeze. J'étais passé par ton excellent site Tyrtamos pour construire mon setup.py. La raison de mon changement s'est perdue dans les méandres de mes souvenirs (c'était il y a deux ou trois ans). Je devrais peut-être y revenir pour voir.
    Ce qui m'ennuie c'est que j'essaye juste de sortir une nouvelle révision de mon logiciel pour lequel j'ai construit un setup.py qui était bien fonctionnel à ce moment là. Sauf qu'entre temps, je suis passé de python(x,y) à Anaconda et que de nombreux modules ont étés mis à jours. Si à chaque fois que je dois sortir une nouvelle révision je bloque à ce stade et que je dois jongler avec les différentes technos pour distribuer cela va être coton !

    Citation Envoyé par Mathilde94
    Je suis sous Windows 7 et PyInstaller 2.1 est passé comme une lettre à la poste !!!
    J'ai très rapidement fait un essai de PyInstaller. Mais ça ne s'est pas passé aussi bien pour moi. Mais j'avoue que c'est une solution alléchante. Leur page github est très active. Je vais creuser plus de ce côté là. D'ailleurs je serais intéressé par un retour sur la taille du paquet final, de la rapidité de lancement (avec py2exe il me fallait bien 30-40s pour que mon appli se lance), facilité à obtenir un exe unique (jamais réussi avec py2exe)?

    Merci de votre aide!

    J

  6. #6
    Expert éminent sénior
    Homme Profil pro
    Architecte technique retraité
    Inscrit en
    Juin 2008
    Messages
    21 283
    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 283
    Points : 36 770
    Points
    36 770
    Par défaut
    Salut,

    Citation Envoyé par Julien N Voir le message
    Si à chaque fois que je dois sortir une nouvelle révision je bloque à ce stade et que je dois jongler avec les différentes technos pour distribuer cela va être coton !
    cx_freeze, py2exe,... sont des outils qui permettent de déployer votre application en réduisant les dépendances avec ce qui est/sera installé (ou pas) sur la cible.
    Pour votre environnement de développement, les dépendances peuvent être gérées en associant un virtualenv/venv à chaque application *et* en stockant quelques parts les packages qui en dépendent (au cas ou vous devriez reconstruire...).
    Dans ce cas, la gestion des dépendances se fait de façon exhaustive et vous savez ou vous en êtes.

    python(x,y) ou Anaconda offrent une autre solution pour gérer les dépendances: çà installe la plupart des bibliothèques qu'auraient besoin ingénieurs/scientifiques non informaticiens. Si vous écrivez une application dans cet environnement là, soit vous créez un venv et vous installez les dépendances (et vous ne dépendez plus que de la version de Python livrée par Python(x,y), Anaconda,....) soit vous galérez car le suivi devient impossible.

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

  7. #7
    Membre éprouvé

    Homme Profil pro
    Ingénieur
    Inscrit en
    Août 2010
    Messages
    654
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France

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

    Informations forums :
    Inscription : Août 2010
    Messages : 654
    Points : 1 150
    Points
    1 150
    Par défaut
    Citation Envoyé par wiztricks Voir le message
    les dépendances peuvent être gérées en associant un virtualenv/venv
    Effectivement. C'est ce qui me parait aussi le plus adapté. D'autant plus que je n'ai aucune raison d'obfusquer mon code (si ce n'est pour prévenir les modifications par erreurs de l'utilisateur). Le soucis c'est qu'à part une poignée de mes collègues (et là je suis gentil), personne n'a la moindre idée de comment faire ne serait-ce qu'un "hello world" en python. Je pourrais diffuser mon fichier d'environnement via anaconda, mais ça ne parlera pas à grand monde.

    Si je veux que mes collègues utilisent mon travail au lieu de rester sur la vieille macro toute pou**ie (lente, rigide, bourrée d'erreurs et se basant sur le solveur de base), je dois abattre toute barrière psychologique. Un exe c'est l'idéal.

    Peut-être que finalement une installation portable de python c'est un bon compromis. Sinon, il va falloir que je fasse du bon lobying et un tuto chiadé!


    Ju

  8. #8
    Expert éminent sénior
    Homme Profil pro
    Architecte technique retraité
    Inscrit en
    Juin 2008
    Messages
    21 283
    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 283
    Points : 36 770
    Points
    36 770
    Par défaut
    Citation Envoyé par Julien N Voir le message
    Effectivement. C'est ce qui me parait aussi le plus adapté. D'autant plus que je n'ai aucune raison d'obfusquer mon code (si ce n'est pour prévenir les modifications par erreurs de l'utilisateur). Le soucis c'est qu'à part une poignée de mes collègues (et là je suis gentil), personne n'a la moindre idée de comment faire ne serait-ce qu'un "hello world" en python. Je pourrais diffuser mon fichier d'environnement via anaconda, mais ça ne parlera pas à grand monde.
    Je parle de développement et de maîtrise des dépendances de vos applications.
    Pour distribuer votre code, un cx_freeze ou équivalent est utile pour ne pas demander aux utilisateurs d'installer Python, les bibliothèques pré-requises eux mêmes (ce que vous pouvez automatisez en partie via pip et son fichier requirements.txt) dans des versions parfois incompatibles avec celles qui viennent dans les distributions "en standard".

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

  9. #9
    Membre à l'essai
    Femme Profil pro
    Assistant aux utilisateurs
    Inscrit en
    Mars 2014
    Messages
    11
    Détails du profil
    Informations personnelles :
    Sexe : Femme
    Localisation : France, Val de Marne (Île de France)

    Informations professionnelles :
    Activité : Assistant aux utilisateurs
    Secteur : Finance

    Informations forums :
    Inscription : Mars 2014
    Messages : 11
    Points : 15
    Points
    15
    Par défaut
    Citation Envoyé par Julien N Voir le message
    J'ai très rapidement fait un essai de PyInstaller. Mais ça ne s'est pas passé aussi bien pour moi. Mais j'avoue que c'est une solution alléchante. Leur page github est très active. Je vais creuser plus de ce côté là. D'ailleurs je serais intéressé par un retour sur la taille du paquet final, de la rapidité de lancement (avec py2exe il me fallait bien 30-40s pour que mon appli se lance), facilité à obtenir un exe unique (jamais réussi avec py2exe)?

    Merci de votre aide!

    J
    En effet, j'avais vraiment eu du mal à l'installer comme il le fallait. Si j'ai du temps, je tenterais de le refaire pour t'aider plus (si tu n'as pas trouvé avant). Après je ne sais pas la taille de ton programme.
    Par exemple pour un de 2900 lignes environ de 96ko qui sera un GUI la création de l'exe se passe en 17 secondes, et le lancement de l'exe en 2 secondes.

Discussions similaires

  1. Installation py2exe MSVCR71.dll introuvable
    Par xilo94 dans le forum Général Python
    Réponses: 6
    Dernier message: 17/01/2014, 18h05
  2. [Compilation] Utilisation d'une DLL "issue des MFC"
    Par elmanu20 dans le forum Outils
    Réponses: 4
    Dernier message: 24/09/2013, 13h53
  3. Appel sous LabVIEW d'une DLL issue de Matlab
    Par franz91 dans le forum LabVIEW
    Réponses: 4
    Dernier message: 09/12/2011, 19h05
  4. Appel sous LabVIEW d'une DLL issue de MATLAB
    Par franz91 dans le forum MATLAB
    Réponses: 0
    Dernier message: 03/03/2011, 12h13
  5. [py2exe] incompatibilité entre version dll
    Par airod dans le forum Py2exe
    Réponses: 1
    Dernier message: 19/09/2007, 13h44

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