Comstackndo código python en un solo exe

He estado tratando de comstackr el código de Python en un solo exe, y no logré hacerlo correctamente.

  1. He intentado pyinstaller, y este es el archivo .spec:

    # -*- mode: python -*- a = Analysis([os.path.join(HOMEPATH,'support\\_mountzlib.py'), os.path.join(HOMEPATH,'support\\useUnicode.py'), 'programs\\toolbox.py'], pathex=['C:\\Users\\Ronaldo\\Desktop\\Python\\pyinstaller']) pyz = PYZ(a.pure) exe = EXE( pyz, a.scripts, a.binaries, a.zipfiles, a.datas, name=os.path.join('dist', 'program.exe'), debug=False, strip=False, upx=True, console=False ) 

    Pyinstaller compiló bien, creó un solo archivo exe que funcionó, pero aparentemente otros usuarios que no tenían la misma versión de python instalada (2.7.2) no pudieron ejecutarla. No da ningún error, simplemente no se inicia. Lo probé enviándolo a algunos amigos y también lo probé en una máquina virtual.

  2. Intenté py2exe. Cuando se trata de comstackr (con todas las bibliotecas junto a ella y el rest de archivos) funciona bien. Intenté comstackrlo en un solo archivo, pero el archivo exe comstackdo me dio un error “toolbox.exe ha dejado de funcionar”. Aquí está el informe de errores, por si acaso, podría ser útil:

     Problem signature: Problem Event Name: APPCRASH Application Name: toolbox.exe Application Version: 0.0.0.0 Application Timestamp: 49180193 Fault Module Name: StackHash_0a9e Fault Module Version: 0.0.0.0 Fault Module Timestamp: 00000000 Exception Code: c0000005 Exception Offset: 01b61fcb OS Version: 6.1.7601.2.1.0.256.1 Locale ID: 1033 Additional Information 1: 0a9e Additional Information 2: 0a9e372d3b4ad19135b953a78882e789 Additional Information 3: 0a9e Additional Information 4: 0a9e372d3b4ad19135b953a78882e789 

    El archivo setup.py es:

     from distutils.core import setup import py2exe, sys, os sys.argv.append('py2exe') setup( options = {'py2exe': {'bundle_files': 1}}, windows = [{'script': "toolbox.py"}], zipfile = None, ) single.py file: 

    Y aquí está el single.py:

     import os, sys, ctypes ctypes.windll.user32.MessageBoxA(0, "curdir: %s\nexedir: %s\nsys.winver: %s" % ( os.path.abspath(os.curdir), os.path.abspath(os.path.dirname(sys.argv[0])), sys.winver, ), "%s - Message" % os.path.basename(sys.executable), 0x30 ) 

El progtwig que escribí utiliza los módulos tkinter, sys, random y win32clipboard (pywin). ¿Qué estoy haciendo mal? ¿Hay otros comstackdores mejores?

Actualización: por la sugerencia de Joël, compilé con depuración y con el modo de consola. Todavía no funcionaba para los usuarios que no tienen Python 2.7. Este es el mensaje de error:

 C:\Users\XXXXX\Desktop>program.exe Found embedded PKG: C:\Users\XXXXX\Desktop\program.exe Extracting binaries Setting up to run child Setting magic environment var Creating child process Waiting for child process to finish... Found embedded PKG: C:\Users\XXXXX\Desktop\program.exe workpath: C:/Users/XXXXX/AppData/Local/Temp/_MEI14042/ manifestpath: C:/Users/XXXXX/AppData/Local/Temp/_MEI14042/program.exe.manifest Activation context created Activation context activated C:\Users\XXXXX\AppData\Local\Temp\_MEI14042\python27.dll Manipulating evironment PYTHONPATH=C:/Users/XXXXX/AppData/Local/Temp/_MEI14042;C:/Users/XXXXX/Desktop importing modules from CArchive extracted iu extracted struct extracted archive Installing import hooks outPYZ1.pyz 

Realmente espero que esto sirva de ayuda para la posible respuesta.

Mis dos centavos: ¿realizó una prueba con la opción de debug de PyInstaller ?

Solo actualice su archivo spec:

 exe = EXE( pyz, [...] debug=True, [...]) 

(Nota: para evitar numerosos cuadros de mensajes, es posible que desee establecer la salida de la console=True : console=True )

Tal vez devolvería algunos datos útiles. Por favor, dénos la salida en este caso (si hay alguno).


Según la salida que obtenga, este es un problema bastante común, porque si PyInstaller resuelve las dependencias para sus módulos, las dependencias de las dependencias pueden ser olvidadas.

En su caso, falta Tcl , y esto lo necesita alguna biblioteca de Tkinter : debería echar un vistazo aquí: Python, Pyinstaller que crea accesos directos en Windows

Según la documentación:

Elaborando en Makespec.py, esta es la línea de comandos admitida: python Makespec.py [opts] […] Donde las OPCIONES permitidas son:

[…]

-K, –tk incluye TCL / TK en el despliegue.

Puede intentarlo con este argumento y verificar el impacto en su archivo de spec . Apuesto a que es una adición en los módulos que se tienen en cuenta en el análisis o en la función EXE.