web-dev-qa-db-fra.com

py2exe ne parvient pas à générer un exécutable

J'utilise python 2.6 sur XP. Je viens d'installer py2exe et je peux créer avec succès un simple hello.exe à partir d'un hello.py. Cependant, lorsque j'essaie d'utiliser py2exe sur mon vrai programme , py2exe génère quelques messages d'information mais ne parvient pas à générer quoi que ce soit dans le dossier dist.

Mon setup.py ressemble à ceci:

from distutils.core import setup
import py2exe

setup(console=['ServerManager.py'])

et la sortie py2exe ressemble à ceci:

python setup.py py2exe
running py2exe
creating C:\DevSource\Scripts\ServerManager\build
creating C:\DevSource\Scripts\ServerManager\build\bdist.win32
   ...
   ...
creating C:\DevSource\Scripts\ServerManager\dist
*** searching for required modules ***
*** parsing results ***
creating python loader for extension 'wx._misc_' (C:\Python26\lib\site-packages\wx-2.8-msw-unicode\wx\_misc_.pyd -> wx._misc_.pyd)
creating python loader for extension 'lxml.etree' (C:\Python26\lib\site-packages\lxml\etree.pyd -> lxml.etree.pyd)
   ...
   ...
creating python loader for extension 'bz2' (C:\Python26\DLLs\bz2.pyd -> bz2.pyd)
*** finding dlls needed ***

py2exe semble avoir trouvé toutes mes importations (même si j'ai été un peu surpris de voir Win32 mentionné, car je ne l'importe pas explicitement). De plus, mon programme démarre très bien avec cette commande:

python ServerManager.py

De toute évidence, je fais quelque chose de fondamentalement mauvais, mais en l'absence de messages d'erreur de py2exe, je ne sais pas quoi.

51
Charles Anderson

J'ai découvert que py2exe fonctionne très bien si je commente la partie de mon programme qui utilise wxPython. De plus, lorsque j'utilise py2exe sur l'exemple `` simple '' fourni avec son téléchargement (c'est-à-dire dans Python26\Lib\site-packages\py2exe\samples\simple), j'obtiens ce message d'erreur:

*** finding dlls needed ***
error: MSVCP90.dll: No such file or directory

Donc, quelque chose sur wxPython fait croire à py2exe que j'ai besoin d'une DLL Visual Studio 2008. Je n'ai pas VS2008, et pourtant mon programme fonctionne parfaitement bien comme répertoire de modules Python. J'ai trouvé une copie de MSVCP90.DLL sur le web, je l'ai installé dans Python26/DLL, et py2exe fonctionne désormais correctement.

Je ne comprends toujours pas d'où vient cette dépendance, car je peux exécuter mon code parfaitement sans py2exe. Il est également ennuyeux que py2exe ne m'ait pas donné de message d'erreur comme il l'a fait avec l'exemple test_wx.py.

Mise à jour supplémentaire: Lorsque j'ai essayé d'exécuter la sortie de py2exe sur un autre PC, j'ai découvert qu'il fallait que MSVCR90.DLL soit installé; donc si votre PC cible n'a pas déjà installé Visual C++ 2008, je vous recommande de télécharger et d'installer Microsoft Visual C++ 2008 Redistributable Package .

40
Charles Anderson

Je mets cela dans tous mes scripts setup.py:

distutils.core.setup(
    options = {
        "py2exe": {
            "dll_excludes": ["MSVCP90.dll"]
        }
    },
    ...
)

Cela maintient py2exe silencieux, mais vous devez toujours vous assurer que la DLL est sur la machine de l'utilisateur.

41
Bill

wxPython n'a rien à voir avec cela. Avant Python 2.6, Python utilisait Visual Studio 2003 comme compilateur Windows. À partir de 2.6, ils sont passés à Visual Studio 2008, qui nécessite un fichier manifeste dans certains Cela a été bien documenté. Voir les liens suivants:

http://wiki.wxpython.org/py2exe

http://py2exe.org/index.cgi/Tutorial#Step52

De plus, si vous créez une application wxPython avec py2exe, vous souhaitez définir le paramètre windows, PAS celui de la console. Peut-être que mon tutoriel vous aidera:

http://www.blog.pythonlibrary.org/2010/07/31/a-py2exe-tutorial-build-a-binary-series/

9
Mike Driscoll

Il semble que ce ne soit qu'une dépendance pour Python 2.6. Je n'obtenais pas cette erreur sous 2.5, mais après la mise à niveau, je le suis.

Ce fil de discussion contient des informations expliquant pourquoi le problème existe et comment le résoudre:
http://www.nabble.com/py2exe,-Py26,-wxPython-and-dll-td20556399.html

Je ne voulais pas avoir à installer le vcredist. Mon application ne nécessite actuellement aucune installation et peut être exécutée par des non-administrateurs, ce que je ne veux pas perdre. J'ai donc suivi les suggestions dans les liens et obtenu les fichiers Microsoft.VC90.CRT.manifest et msvcr90.dll nécessaires en installant Python "pour cet utilisateur uniquement". J'avais également besoin de msvcp90.dll que je trouvé dans le dossier WinSxS d'une installation "tous les utilisateurs" Python 2.6. Comme j'en avais déjà deux sur trois, j'ai inclus msvcm90.dll pour éviter de futures erreurs bien que je n'aie pas obtenu immédiatement erreurs lorsque je l'ai laissé de côté. J'ai mis le manifeste et les trois DLL dans le dossier libs utilisé par mon application figée.

L'astuce que j'ai dû effectuer était d'inclure une copie supplémentaire du manifeste et de msvcr90.dll à la racine de mon dossier d'application à côté de l'exécutable généré par py2exe. Cette copie de la DLL est utilisée pour bootstrap l'application), mais elle ne semble alors apparaître que dans le dossier libs.

Espérons que cette découverte aide quelqu'un d'autre.

De plus, j'ai eu le même problème avec py2exe log un vrai message d'erreur. Puis j'ai réalisé que stderr n'était pas redirigé dans mon fichier journal. Ajoutez "> build.log 2> & 1" sur la ligne de commande où vous appelez py2exe.

6
resplin
import sys

sys.path.append('C:\\WINDOWS\\WinSxS\\x86_Microsoft.vc90.crt_1fc8b3b9a1e18e3b_9.0.30729.4148_none_5090ab56bcba71c2')

Sur chaque Windows, vous pouvez trouver le fichier MSVCP90.dll dans un sous-répertoire de C:\\WINDOWS\\WinSxS\\

Dans mon cas, le répertoire était: x86_Microsoft.vc90.crt_1fc8b3b9a1e18e3b_9.0.30729.4148_none_5090ab56bcba71c2.

Aller à C:\\WINDOWS\\WinSxS\\ et utilisez la recherche de fichiers Windows pour trouver MSVCP90.dll.

6
Egor

Juste pour votre information, pour moi, cela a fonctionné pour copier les fichiers

Microsoft.VC90.CRT.manifest msvcr90.dll

dans le répertoire avec le .exe sur la machine de l'utilisateur (qui n'a pas python ou VC redistribuable installé).

Merci pour toutes les astuces ici!

3
george

La sortie indique que vous utilisez WX. Essayez d'exécuter py2exe avec votre script spécifié en tant qu'application graphique au lieu de la console. Si je ne me trompe pas, cela a tendance à causer des problèmes avec py2exe.

1
sli

Essayez ceci: http://www.py2exe.org/index.cgi/Tutorial#Step52

Ça a marché pour moi

1
bazzinga