2009-07-20 17 views
7

Soy muy nuevo en Python en general, pero hice una aplicación en Python 2.6/wxPython 2.8 que funciona perfectamente cuando la ejecuto a través de Python. Pero quería dar un paso más y poder implementarlo como un ejecutable de Windows, así que he estado probando py2exe. Pero no he podido hacer que funcione. Siempre compilaría un exe, pero cuando realmente intento ejecutarlo, ladra un mensaje de error críptico. Al principio eran simples mensajes diciendo que no podía encontrar ciertos archivos DLL, pero incluso después de darle todas las DLL que quería, que ahora vuelve esto:¿Cómo debo depurar una aplicación py2exe 'la aplicación no se pudo inicializar correctamente' error?

The application failed to initialize properly (0xc0000142). 
Click OK to terminate the application. 

Así que rompieron las cosas y que acaba de hacer un muy, muy aplicación simple utilizando wxPython solo para ver si eso funcionaría, o si algunas de las características más complicadas de mi aplicación original se interponían en el camino. Pero incluso mi simple prueba arrojó el mismo error. Aquí está el código por la simple escritura de la prueba:

import wx 

class MainWindow(wx.Frame): 

    def __init__(self, parent, id, title): 
     wx.Frame.__init__(self, parent, wx.ID_ANY, title, style=wx.DEFAULT_FRAME_STYLE^wx.MAXIMIZE_BOX) 
     panel = wx.Panel(self, -1, style = wx.TAB_TRAVERSAL | wx.CLIP_CHILDREN | wx.FULL_REPAINT_ON_RESIZE) 
     main_sizer = wx.BoxSizer(wx.VERTICAL) 

     testtxt = wx.StaticText(panel, -1, label='This is a test!') 
     main_sizer.Add(testtxt, 0, wx.ALIGN_CENTER) 

     panel.SetSizerAndFit(main_sizer) 
     self.Show(1) 
     return 

app = wx.PySimpleApp() 
frame = MainWindow(None, -1, 'Test App') 
app.MainLoop() 

y aquí está la secuencia de comandos de configuración py2exe utilicé:

#!/usr/bin/python 

from distutils.core import setup 
import py2exe 

manifest = """ 
<?xml version="1.0" encoding="UTF-8" standalone="yes"?> 
<assembly xmlns="urn:schemas-microsoft-com:asm.v1" 
manifestVersion="1.0"> 
<assemblyIdentity 
    version="0.64.1.0" 
    processorArchitecture="x86" 
    name="Controls" 
    type="win32" 
/> 
<description>Test Program</description> 
<dependency> 
    <dependentAssembly> 
     <assemblyIdentity 
      type="win32" 
      name="Microsoft.Windows.Common-Controls" 
      version="6.0.0.0" 
      processorArchitecture="X86" 
      publicKeyToken="6595b64144ccf1df" 
      language="*" 
     /> 
    </dependentAssembly> 
</dependency> 
</assembly> 
""" 

setup(
    windows = [ 
     { 
      "script": "testme.py", 
      "icon_resources": [(1, "testme.ico")], 
      "other_resources": [(24,1, manifest)] 
     } 
    ], 
    data_files=["testme.ico"] 

)

Luego ejecutar python setup.py py2exe, genera el archivo EXE, advierte sobre algunos archivos DLL (que posteriormente copio en el directorio dist), pero cuando trato de ejecutar el EXE, obtengo el error que cité arriba inmediatamente.

+1

-1: Título de pregunta terrible. Quizás esto debería ser: "¿Cómo puedo depurar una aplicación py2exe 'no pudo inicializar correctamente' error?" –

+1

Perdón por el título, S.Lott. Ahora ha sido cambiado. – SoaperGEM

Respuesta

10

Tenga en cuenta que hay una versión posterior del paquete redistribuible de Visual C++ 2008: SP1. Sin embargo, tanto el SP1 como la versión anterior no instalan las DLL en la ruta.Como dice la página de descarga (el subrayado es mío):

This package installs runtime components of C Runtime (CRT), Standard C++, ATL, MFC, OpenMP and MSDIA libraries. For libraries that support side-by-side deployment model (CRT, SCL, ATL, MFC, OpenMP) they are installed into the native assembly cache, also called WinSxS folder, on versions of Windows operating system that support side-by-side assemblies.

Es probable que encontrar estos archivos en la carpeta %WINDIR%\WinSxS y no en el path.What Creo que hay que hacer es incorporar la información del manifiesto de los archivos DLL pertinentes (encontrado en %WINDIR%\WinSxS\Manifests) en su setup.py. Me añade la siguiente sección:

<dependency> 
    <dependentAssembly> 
     <assemblyIdentity 
      type="win32" 
      name="Microsoft.VC90.CRT" 
      version="9.0.30729.4918" 
      processorArchitecture="X86" 
      publicKeyToken="1fc8b3b9a1e18e3b" 
      language="*" 
     /> 
    </dependentAssembly> 
</dependency> 

inmediatamente después de la sección existente <dependency>, y se reconstruyó el exe: funcionó sin problemas. Nota: según exactamente la versión de los archivos de Visual C++ que instaló, la información anterior puede no ser exactamente correcta. Mira los manifiestos en su sistema y utilizar la correcta version, etc. publicKeyToken

Alternativamente, mira this answer de cómo implementar las DLL con su aplicación (en lugar de asumir que ya existen en el sistema de destino). Oh ... Veo que pedirá que pregunta original ;-)

+0

Añadiendo que '' lo hizo! Muchas gracias! – SoaperGEM

+0

Por cierto, dado un archivo DLL, ¿cómo se encuentra el publicKeyToken para ello? Por ejemplo, en realidad tengo la versión 9.0.30729.1 de la DLL anterior; ¿cómo podría obtener el publicKeyToken adecuado para ello? – SoaperGEM

+2

Busque en el directorio de Manifiestos que mencioné anteriormente para el manifiesto específico que necesita. –

0

He usado py2exe antes y nunca me he encontrado en una situación como esta ....

Sin embargo, parece que las dependencias que faltan son su problema .....

¿El el programa empaquetado funciona en su máquina pero no en otros?

Si es así, ejecute la aplicación empaquetada dentro de DEPENDS (walker de dependencias) en ambas máquinas y compárelo para discernir qué paquetes no se incluyeron.

buena suerte

+0

¿Por "programa empaquetado" quiere decir el exe generado? ¿O simplemente ejecutando el script directamente a través de Python? De todos modos, si ejecuto 'python testme.py' desde la línea de comandos, eso funciona bien. Pero el objetivo de ejecutar esto a través de py2exe es que quiero poder implementarlo en computadoras que * no * tienen instalado Python. Pero en este momento no está funcionando en * cualquier * computadora, Python o no, cuando lo compilo con py2exe. – SoaperGEM

+0

Programa empaquetado = Exe generado. El exe debería funcionar bien en la máquina que lo produjo. Ejecútelo en esa máquina con el caminador de dependencias para ver la lista explícita de bibliotecas cargadas. Luego gire y haga esto en una máquina que falla. La diferencia le indicará una solución. – CMB

+0

Ese fue mi punto todo el tiempo ... el programa empaquetado * NO * funciona bien en la máquina que lo produjo. De ahí el título. – SoaperGEM

0

No se supone que copiar todos los archivos .dll se queja! Algunos de ellos son archivos del sistema de Windows y están presentes en los lugares correctos del sistema. Si los copia en la carpeta dist, las cosas no funcionarán correctamente.

En general, solo desea copiar .dlls que son específicos de su aplicación. No sistema .dlls. En algunas situaciones, puede que necesite enviar vcredist_xx.exe en su instalador para obtener el tiempo de ejecución de MSVC en el sistema. Nunca intente enviar esos archivos .dlls "en bruto" usted mismo. Use el paquete de redist, le ahorrará tiempo y frustración.

¿Has intentado seguir las instrucciones aquí: http://wiki.wxpython.org/SmallApp?

+0

Intenté esas instrucciones, y esto es lo que sucedió. 1. Intentó ejecutar 'python setup.py py2exe --icon = SmallApp.ico', obtuvo este error:' error: opción --icon no reconocido'. 2. Intentó ejecutar 'python setup.py py2exe', obtuvo este error:' error: error en setup.cfg: comando 'py2exe' no tiene esa opción 'version_legalcopyright''. 3. Se eliminó el archivo setup.cfg y se intentó volver a ejecutar 'python setup.py py2exe', py2exe * apareció * para ejecutar bien, se crearon directorios dist y con archivos en ellos, excepto que no se creó un archivo EXE en dist! (que no sea solo w9xpopen.exe, que no hace nada por sí mismo) – SoaperGEM

+0

4. Modificó la configuración.El archivo py en las instrucciones para que coincida con el que publiqué arriba en la pregunta aquí (excepto las referencias modificadas de 'testme' a' smallapp'), y compiló bien, produjo una multa EXE, pero el EXE que creó tiene exactamente el mismo error: la aplicación no se pudo inicializar correctamente. – SoaperGEM

+0

No estoy seguro de si este fue el caso cuando se publicó la respuesta, pero a partir de ahora los dlls redistribuibles de VC NO se consideran archivos del sistema y deberían distribuirse al lado de las aplicaciones que los usan: http://support.microsoft .com/kb/326922 – hexedpackets

0

¿Estás seguro de que das el mismo dll que el utilizado por wxPython?

Las vC++ dlls utilizadas por wxpython se pueden descargar desde la página de descarga de wxpython. ¿Has probado estos?

+0

Cuando intento ejecutar EXE sin copiar archivos DLL, en realidad obtengo este error: Esta aplicación no se ha podido iniciar porque no se encontró MSVCR90.dll. Volver a instalar la aplicación puede solucionar este problema. Luego copio msvcr90.dll a la carpeta dist y obtengo el error "la aplicación no se pudo inicializar correctamente" mencionada anteriormente. AFAIK, esta DLL es del paquete VC++. – SoaperGEM

+0

¿También instaló el paquete redistruable de Visual C++? – luc

+0

Sí, lo hice, en particular, instalé el [paquete 2008] (http://www.microsoft.com/downloads/details.aspx?FamilyID=9b2da534-3e03-4391-8a4d-074b9f2bc1bf&displaylang=en) antes de publicarlo. pregunta. – SoaperGEM

Cuestiones relacionadas