2008-11-27 8 views
51

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 produit quelques messages d'information mais ne parvient pas à générer quoi que ce soit dans le dossier dist.py2exe ne parvient pas à générer un exécutable

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 (bien que j'étais un peu surpris de voir win32 mentionné, car je ne l'ai pas importé explicitement). En outre, mon programme démarre très heureux avec cette commande:

python ServerManager.py 

Il est clair que je fais quelque chose de fondamentalement mauvais, mais en l'absence de tout message d'erreur de py2exe je ne sais pas quoi.

+0

S'il n'y a vraiment pas plus la production, de py2exe, c'est un vraiment bizarre. Habituellement, il vous dira pourquoi il échoue. Le meilleur que je peux dire est avez-vous lu à travers tous ceux-ci: http://www.py2exe.org/index.cgi/Py2exeAndwxPython –

+0

Charles: Je vérifie celui-ci régulièrement, je suis intrigué à la solution. Si vous le comprenez, s'il vous plaît poster. Merci. –

Répondre

40

J'ai découvert que py2exe fonctionne très bien si je commente la partie de mon programme qui utilise wxPython. Aussi, quand je l'utilise py2exe sur l'échantillon 'simple' qui vient avec son téléchargement (dans Python26 \ Lib \ site-packages \ py2exe \ samples \ simples), je reçois ce message d'erreur:

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

donc quelque chose à propos de wxPython, py2exe pense que j'ai besoin d'une DLL Visual Studio 2008. Je n'ai pas VS2008, et pourtant mon programme fonctionne parfaitement comme un répertoire de modules Python. J'ai trouvé une copie de MSVCP90.DLL sur le Web, l'ai installé dans Python26/DLL, et py2exe fonctionne maintenant bien.

Je ne comprends toujours pas d'où cette dépendance est venue, puisque je peux parfaitement exécuter mon code sans py2exe. C'est aussi agaçant que py2exe ne m'a pas donné un message d'erreur comme 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 que MSVCR90.DLL devait être installé; donc si votre PC cible n'a pas encore Visual C++ 2008 installé, je vous recommande de télécharger et d'installer le Microsoft Visual C++ 2008 Redistributable Package.

+0

J'ai eu le même problème et appliqué votre solution et cela a fonctionné parfaitement. Merci d'avoir partagé! –

+4

J'ai eu le même problème avec l'application PyQt4. Le téléchargement de la DLL a aidé, merci! – kender

+6

Lien vers msvcp90.dll - http://www.dll-files.com/dllindex/dll-files.shtml?msvcp90 –

1

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.

+0

D'accord, mon setup.py ressemble maintenant à ceci: de distutils.core configuration d'importation importation py2exe configuration (windows = [{ "script": 'ServerManager.py'}]) mais qui n'a eu aucun effet . Cependant, j'ai réussi à prouver que wxPython cause le problème. Si je n'importe pas wx, py2exe fonctionne parfaitement. –

+0

Télécharger MSVCR90.DLL en le copiant sur Python26/DLL a fonctionné pour moi! – Alex

40

Je mets cela dans tous mes scripts setup.py:

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

Cela permet de maintenir py2exe calme, mais vous devez toujours vous assurer que dll est sur la machine de l'utilisateur.

+5

+1: Cette réponse est vraiment la seule correcte pour la question originale, qui rapportait un problème * lors de * la construction avec py2exe. Il est tout à fait vrai (comme indiqué dans la propre réponse de Charles) que vous avez toujours besoin de la DLL pour être sur la machine cible, mais en supposant que vous avez traité cela et que vous obtenez toujours cette erreur sur la machine de construction ci-dessus ferme bien py2exe et laisse votre construction complète. –

+0

Cela avait donné mes problèmes pendant un moment, juste essayé cette correction et cela a fonctionné à 100%. – rectangletangle

-2
import sys 

sys.path.append('c:/Program Files/Microsoft Visual Studio 9.0/VC/redist/x86/Microsoft.VC90.CRT') 
+0

Pourriez-vous expliquer à OP ce que fait ce code? (éditez votre message). Merci – Paco

6

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

Ce fil de discussion a quelques informations pour expliquer pourquoi le problème existe et comment y remédier:
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 qui est un comportement 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'ai également besoin de msvcp90.dll que j'ai trouvé dans le dossier WinSxS d'une installation Python 2.6 "Tous les utilisateurs". Comme j'ai déjà eu deux des trois, j'ai inclus msvcm90.dll pour éviter de futures erreurs même si je n'ai pas eu d'erreurs immédiates quand je l'ai laissé. J'ai mis le manifeste et les trois DLL dans le dossier libs utilisé par mon application gelée.

L'astuce que je devais effectuer était d'inclure une copie supplémentaire du manifeste et msvcr90.dll dans 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 amorcer l'application, mais elle semble ensuite ne regarder que dans le dossier libs.

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

En outre, j'ai eu le même problème avec py2exe enregistrant 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.

+1

Comme documenté dans ce fil: http: // stackoverflow.com/questions/1570542/ma solution n'était pas aussi intelligent que je pensais; cela conduit à d'autres erreurs. Je vais juste devoir installer vcredist. Arg – resplin

+2

Je dis que vous êtes toujours intelligent. Peut-être que cela ne fonctionne pas avec une application qui utilise SQLite, mais j'ai essayé l'astuce d'ajouter les 3 DLL et le fichier manifest dans le répertoire d'exécution. Cela a permis à mon application Python26/py2exe assez simple de fonctionner correctement sans erreurs et sans avoir à installer vc_redist sur la machine (Win2003 Server), ce que je ne pouvais pas faire de toute façon sur la machine d'un client. Werner F. Bruhin a plus de détails sur cette solution simple ici: http://sourceforge.net/mailarchive/message.php?msg_name=hlav67%24627%241%40ger.gmane.org –

3

Juste pour votre information, pour moi, il a travaillé pour copier les fichiers

Microsoft.VC90.CRT.manifest msvcr90.dll

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

Merci pour tous les conseils ici!

+1

Je voulais juste dire que Le nom du fichier Microsoft.VC90.CRT.manifest est crucial. Mon manifeste a été nommé x86_Microsoft.VC90.CRT_1fc8b3b9 ..._ 9.0.21022.8_x-ww_d08 ..... manifeste et cela m'a donné un peu de mal à la tête en me demandant pourquoi ça ne fonctionnait pas. Merci! –

10

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

http://wiki.wxpython.org/py2exe

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

En outre, si vous créez une application avec wxPython py2exe, vous souhaitez définir les paramètres Windows, pas la console un. Peut-être que mon tutoriel va vous aider:

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

6
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 certains sous-répertoire dans C:\\WINDOWS\\WinSxS\\

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

Accédez à C:\\WINDOWS\\WinSxS\\ et utilisez la recherche de fichier Windows pour trouver MSVCP90.dll.

+0

merci ça a aidé – sam

-1

Sur mon Win8.1, je ne trouve pas le chemin

c:/Program Files/Microsoft Visual Studio 9.0/VC/Redist/x86/Microsoft.VC90.CRT

Au contraire, la dll se trouve dans

C: /WINDOWS/WinSxS/x86_Microsoft.VC90.CRT_XXXXXXX

Le XXX peut varier en fonction de votre PC

Vous pouvez rechercher dans le chemin, puis ajoutez le chemin en vous setup.py

import sys 
sys.path.append('C:/WINDOWS/WinSxS/x86_Microsoft.VC90.CRT_XXXXXXX') 
Questions connexes