python - py2exe no puede generar un ejecutable
wxpython (11)
La salida dice que estás usando 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.
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.
Mi setup.py se ve así:
from distutils.core import setup
import py2exe
setup(console=[''ServerManager.py''])
y el resultado py2exe se ve así:
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 todas mis importaciones (aunque estaba un poco sorprendido de ver Win32 mencionado, ya que no lo estoy importando explícitamente). Además, mi programa se inicia bastante feliz con este comando:
python ServerManager.py
Claramente estoy haciendo algo fundamentalmente incorrecto, pero a falta de cualquier mensaje de error de py2exe no tengo idea de qué.
Puse esto en todos mis scripts setup.py:
distutils.core.setup(
options = {
"py2exe": {
"dll_excludes": ["MSVCP90.dll"]
}
},
...
)
Esto mantiene py2exe en silencio, pero aún necesita asegurarse de que dll esté en la máquina del usuario.
Parece que esto es solo 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 sobre por qué existe el problema y cómo solucionarlo:
http://www.nabble.com/py2exe,-Py26,-wxPython-and-dll-td20556399.html
No quería 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 py2exe. Esta copia de la DLL se usa para iniciar la aplicación, pero luego parece que solo mira en la carpeta libs.
Con suerte, 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 comando donde invoca py2exe.
Solo por su información, para mí funcionó copiar los archivos
Microsoft.VC90.CRT.manifest msvcr90.dll
en el directorio con el .exe en la máquina del usuario (que no tiene python o VC redistributable instalado).
Gracias por todos los consejos aquí!
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. Vea los siguientes enlaces:
http://wiki.wxpython.org/py2exe
http://py2exe.org/index.cgi/Tutorial#Step52
Además, si está creando una aplicación wxPython con py2exe, entonces desea establecer el parámetro de Windows, NO el de consola. Tal vez mi tutorial te ayudará a:
http://www.blog.pythonlibrary.org/2010/07/31/a-py2exe-tutorial-build-a-binary-series/
Descubrí que py2exe funciona bien si hago un comentario sobre la parte de mi programa que usa wxPython. Además, cuando uso py2exe en la muestra ''simple'' que viene con su descarga (es decir, en Python26 / Lib / site-packages / py2exe / samples / simple), aparece este mensaje de error:
*** finding dlls needed ***
error: MSVCP90.dll: No such file or directory
Entonces, algo sobre 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.
Actualización adicional: 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 ya instalado Visual C ++ 2008, le recomiendo que descargue e instale el paquete redistribuible de Microsoft Visual C ++ 2008 .
Pruebe esto: http://www.py2exe.org/index.cgi/Tutorial#Step52
Funcionó para mí
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
en algún 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
.
import sys
sys.path.append(''c:/Program Files/Microsoft Visual Studio 9.0/VC/redist/x86/Microsoft.VC90.CRT'')
Hay algo de información en la wiki de wxPython.
En mi win8.1, no encuentro el camino
c: / Archivos de programa / Microsoft Visual Studio 9.0 / VC / redist / x86 / Microsoft.VC90.CRT
Por el contrario, el dll se encuentra en
C: /WINDOWS/WinSxS/x86_Microsoft.VC90.CRT_XXXXXXX
El XXX puede variar según tu PC
Puede buscar en la ruta y luego agregar la ruta en usted setup.py
import sys
sys.path.append(''C:/WINDOWS/WinSxS/x86_Microsoft.VC90.CRT_XXXXXXX'')