2008-11-27 18 views
51

Estoy usando python 2.6 en XP. Acabo de instalar py2exe y puedo crear con éxito un hello.exe simple desde un hello.py. Sin embargo, cuando intento usar py2exe en mi programa real, py2exe produce algunos mensajes de información pero no genera nada en la carpeta dist.py2exe no genera un ejecutable

Mi setup.py se parece a esto:

from distutils.core import setup 
import py2exe 

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

y la salida py2exe se parece a esto:

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 parece haber encontrado todos mis importaciones (aunque estaba un poco sorprendido de vea win32 mencionado, ya que no lo estoy importando explícitamente). Además, mi programa se pone en marcha felizmente con este comando:

python ServerManager.py 

Es evidente que estoy haciendo algo fundamentalmente equivocado, pero en ausencia de cualquier mensaje de error de py2exe no tengo ni idea de qué.

+0

Si realmente no hay más producción, desde py2exe, esta es una muy extraña. Por lo general, le dirá por qué falla. Lo mejor que puedo decir es que ha leído todo esto: http://www.py2exe.org/index.cgi/Py2exeAndwxPython –

+0

Charles: Estoy revisando este con regularidad, estoy intrigado con la solución. Si lo encuentras, por favor publica de nuevo. Gracias. –

Respuesta

40

Descubrí que py2exe funciona bien si comente la parte de mi programa que usa wxPython. Además, cuando se utiliza py2exe en la muestra 'simple' que viene con su descarga (es decir, en Python26 \ Lib \ site-packages \ py2exe \ samples \ sencilla), me sale este mensaje de error:

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

Así que algo acerca de wxPython hace que py2exe piense que necesito una DLL de Visual Studio 2008. No tengo VS2008, pero mi programa funciona perfectamente como un directorio de módulos de Python. Encontré una copia de MSVCP90.DLL en la web, la instalé en Python26/DLL, y py2exe ahora funciona bien.

Todavía no entiendo de dónde viene esta dependencia, ya que puedo ejecutar mi código perfectamente bien sin py2exe. También es molesto que py2exe no me haya dado un mensaje de error como lo hizo con la muestra test_wx.py.

Otra actualización: Cuando traté de ejecutar la salida de py2exe en otra PC, descubrí que necesitaba tener instalado MSVCR90.DLL; entonces si su PC objetivo no tiene instalado Visual C++ 2008, le recomiendo que descargue e instale el Microsoft Visual C++ 2008 Redistributable Package.

+0

Tuve el mismo problema y apliqué su solución y funcionó perfectamente. ¡Gracias por compartir! –

+4

Tuve el mismo problema con la aplicación PyQt4. Descargar la DLL ayudó, gracias! – kender

+6

Enlace a msvcp90.dll - http://www.dll-files.com/dllindex/dll-files.shtml?msvcp90 –

1

La salida dice que está utilizando WX. Intente ejecutar py2exe con su script especificado como una aplicación GUI en lugar de la consola. Si no me equivoco, eso tiende a causar problemas con py2exe.

+0

bien, mi setup.py ahora se ve así: de distutils.core Configuración de importación de importación py2exe configuración (ventanas = [{ "guión": 'ServerManager.py'}]) pero que no tiene ningún efecto . Sin embargo, he logrado demostrar que wxPython está causando el problema. Si no importo wx, py2exe funciona perfectamente. –

+0

Descargando MSVCR90.DLL y copiándolo en Python26/¡Las DLL funcionaron para mí! – Alex

40

que poner esto en todos mis guiones setup.py:

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

Esto mantiene py2exe tranquilo, pero todavía se necesita para asegurarse de que la DLL está en la máquina del usuario.

+5

+1: Esta respuesta es realmente la única correcta para la pregunta original, que informó un problema * durante * compilación con py2exe. Es bastante cierto (como se señala en la propia respuesta de Charles) que aún necesita que el DLL esté en la máquina de destino, pero suponiendo que haya solucionado eso y todavía obtiene este error en la máquina de compilación (como lo hice) la respuesta de Bill más arriba, cierra py2exe y permite completar tu compilación. –

+0

Esto ha estado dando mis problemas por un tiempo, acabo de probar esta solución y funcionó al 100%. – rectangletangle

-2
import sys 

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

¿Podría explicarle a OP lo que hace este código? (edite su publicación). Gracias – Paco

6

Parece que este no es más que una dependencia para Python 2.6. No recibí este error en 2.5, pero después de la actualización sí lo estoy.

Este hilo de correo electrónico tiene algunos antecedentes de por qué existe el problema y cómo solucionarlo:
http://www.nabble.com/py2exe,-Py26,-wxPython-and-dll-td20556399.html

Yo no quiero tener que instalar el vcredist. Actualmente, mi aplicación no requiere instalación y la pueden ejecutar los que no son administradores, que es un comportamiento que no quiero perder. Así que seguí las sugerencias en los enlaces y obtuve los necesarios Microsoft.VC90.CRT.manifest y msvcr90.dll instalando Python "solo para este usuario".También necesitaba msvcp90.dll que encontré en la carpeta WinSxS de una instalación de "todos los usuarios" de Python 2.6. Como ya tenía dos de los tres, incluí msvcm90.dll para evitar errores futuros aunque no recibí ningún error inmediato cuando lo dejé fuera. Puse el manifiesto y las tres DLL en la carpeta libs utilizada por mi aplicación congelada.

El truco que tuve que realizar fue incluir una copia adicional del manifiesto y msvcr90.dll en la raíz de la carpeta de mi aplicación junto al ejecutable generado por py2exe. Esta copia de la DLL se usa para iniciar la aplicación, pero luego parece que solo mira en la carpeta libs.

Afortunadamente ese descubrimiento ayuda a alguien más.

Además, tuve el mismo problema al tener el log py2exe como un verdadero mensaje de error. Luego me di cuenta de que stderr no se redireccionaba a mi archivo de registro. Agregue "> build.log 2> & 1" en la línea de comandos donde invoca py2exe.

+1

Como se documenta en este hilo: http: // stackoverflow.com/questions/1570542/mi solución no fue tan inteligente como pensé; conduce a otros errores. Voy a tener que instalar vcredist. Arg – resplin

+2

Digo que todavía eres inteligente. Tal vez no funcione con una aplicación que usa SQLite, pero probé el truco de agregar los 3 dlls y el archivo de manifiesto al directorio de tiempo de ejecución. Esto permitió que mi aplicación Python26/py2exe bastante simple se ejecutara correctamente sin errores y sin tener que instalar vc_redist en la máquina (Win2003 Server), que de todos modos no pude hacer en la máquina de un cliente. Werner F. Bruhin tiene más detalles sobre esta sencilla solución aquí: http://sourceforge.net/mailarchive/message.php?msg_name=hlav67%24627%241%40ger.gmane.org –

3

Sólo para su información, para mí funcionó para copiar los archivos

Microsoft.VC90.CRT.manifest msvcr90.dll

en el directorio con el .exe en el equipo del usuario (que tiene no se instaló Python o VC redistributable).

Gracias por todos los consejos aquí!

+1

Solo quería decir que El nombre de Microsoft.VC90.CRT.manifest es crucial. Mi manifiesto se llamaba x86_Microsoft.VC90.CRT_1fc8b3b9 ..._ 9.0.21022.8_x-ww_d08 ..... manifest y me dio un poco de dolor de cabeza preguntándome por qué no estaba funcionando. ¡Gracias! –

10

wxPython no tiene nada que ver con eso. Antes de Python 2.6, Python usó Visual Studio 2003 como su compilador de Windows. A partir de 2.6, cambiaron a Visual Studio 2008, que requiere un archivo de manifiesto en algunas situaciones. Esto ha sido bien documentado. Consulte los siguientes enlaces:

http://wiki.wxpython.org/py2exe

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

Además, si va a crear una aplicación con wxPython py2exe, a continuación, desea establecer el parámetro de ventanas, NO la consola uno. Tal vez mi tutorial le ayudará a:

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') 

En cada Windows, puede encontrar el archivo MSVCP90.dll de alguna subdirectorio en C:\\WINDOWS\\WinSxS\\

En mi caso, el directorio era: x86_microsoft.vc90.crt_1fc8b3b9a1e18e3b_9.0.30729.4148_none_5090ab56bcba71c2.

Vaya a C:\\WINDOWS\\WinSxS\\ y use la búsqueda de archivos de Windows para encontrar MSVCP90.dll.

+0

gracias ayudo – sam

-1

En mi Win8.1, no encuentro el camino

c:/Archivos de programa/Microsoft Visual Studio 9.0/VC/Redist/86/Microsoft.VC90.CRT

Por el contrario, se encuentra el archivo DLL en

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

El XXX puede variar de acuerdo a su PC

Usted puede buscar en el camino, a continuación, añadir la ruta en la que setup.py

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