How to debug a broken PyInstaller assembly?

I used PyInstaller only once before, and it worked pretty directly with wxPython. I'm currently trying to create another project. The project works well when launched from the command line. However, after creating it, it never launches the main window (wxPython).

I set the debug flags and the True console in the assembly specification. I also added a verbose version ( [('v', '', 'OPTION')] ), as indicated in the PyInstaller manual. Here is the specification:

  # - * - mode: python - * -
 # basedir = os.path.realpath (os.path.dirname (__ file__))
 basedir = os.getcwd ()

 # Build the icons toc.
 icons_toc = []
 for dir in os.walk (os.path.join (basedir, 'icons')):
     for icon in dir [2]:
         icons_toc.append (
             (
                 os.path.join ('icons', icon),
                 os.path.join (dir [0], icon),
                 'DATA',
             )
         )

 a = Analysis (
     ['application.py'],
     pathex = ['.', './lib', '../broadpy/lib', '../broadpy/vendor'],
     hiddenimports = [],
     hookspath = None
 )
 a.datas + = icons_toc

 pyz = PYZ (a.pure)

 exe = EXE (
     pyz
     a.scripts + [('v', '', 'OPTION')],
     a.binaries,
     a.zipfiles,
     a.datas,
     name = os.path.join (
         'dist', 'Address cleaner.exe'
     ),
     debug = True,
     strip = None,
     upx = True,
     console = True
 )

 app = BUNDLE (
     exe
     name = os.path.join ('dist', 'Address cleaner.app')
 )

Now, when I run the embedded executable, I get this output:

  C: \ Users \ tomas \ Dropbox \ Broadnet \ address_cleaner> "C: \ Users \ tomas \ Dropbox \ Broadnet \ address_cleaner \ dist \ Address cleaner.exe"
 _MEIPASS2 is NULL
 archivename is C: \ Users \ tomas \ Dropbox \ Broadnet \ address_cleaner \ dist \ Address cleaner.exe
 Extracting binaries
 Executing self as child with Setting up to run child
 Creating child process
 Waiting for child process to finish ...
 _MEIPASS2 is C: / Users / tomas / AppData / Local / Temp / _MEI30762 /
 archivename is C: \ Users \ tomas \ Dropbox \ Broadnet \ address_cleaner \ dist \ Address cleaner.exe
 Already in the child - running!
 manifestpath: C: / Users / tomas / AppData / Local / Temp / _MEI30762 / Address cleaner.exe.manifest
 Activation context created
 Activation context activated
 C: /Users/tomas/AppData/Local/Temp/_MEI30762/python27.dll
 Manipulating evironment
 PYTHONPATH = C: / Users / tomas / AppData / Local / Temp / _MEI30762; C: / Users / tomas / Dropbox / Broadnet / address_cleaner / dist
 PYTHONHOME = C: / Users / tomas / AppData / Local / Temp / _MEI30762 /
 v
 # installing zipimport hook
 import zipimport # builtin
 # installed zipimport hook
 importing modules from CArchive
 import marshal # builtin
 extracted iu
 import imp # builtin
 import nt # builtin
 extracted struct
 import _struct # builtin
 extracted archive
 Installing import hooks
 out00-PYZ.pyz
 Running scripts
 import zlib # builtin
 import errno # builtin
 import _weakref # builtin
 import _codecs # builtin
 import _sre # builtin
 import _collections # builtin
 import operator # builtin
 import itertools # builtin
 import _bisect # builtin
 import _heapq # builtin
 import thread # builtin
 import math # builtin
 import binascii # builtin
 import _hashlib # dynamically loaded from C: \ Users \ tomas \ AppData \ Local \ Temp \ _MEI30762 \ _hashlib.pyd
 import _random # builtin
 import cStringIO # builtin
 Traceback (most recent call last):
   File "", line 65, in 
   File "C: \ Users \ tomas \ Downloads \ pyinstaller-2.0 \ PyInstaller \ loader \ iu.py", line 386, in importHook
   File "C: \ Users \ tomas \ Downloads \ pyinstaller-2.0 \ PyInstaller \ loader \ iu.py", line 480, in doimport
   File "C: \ Users \ tomas \ Dropbox \ Broadnet \ address_cleaner \ build \ pyi.win32 \ buildspec \ out00-PYZ.pyz \ win32com", line 5, in 
   File "C: \ Users \ tomas \ Downloads \ pyinstaller-2.0 \ PyInstaller \ loader \ iu.py", line 386, in importHook
   File "C: \ Users \ tomas \ Downloads \ pyinstaller-2.0 \ PyInstaller \ loader \ iu.py", line 459, in doimport
   File "C: \ Users \ tomas \ Downloads \ pyinstaller-2.0 \ PyInstaller \ loader \ iu.py", line 248, in getmod
   File "C: \ Users \ tomas \ Downloads \ pyinstaller-2.0 \ PyInstaller \ loader \ iu.py", line 105, in getmod
 ImportError: DLL load failed: The specified module could not be found.
 RC: -1 from pyi_rth_win32comgenpy
 OK
 Deactivating activation context
 Releasing activation context
 Done
 # clear __builtin __._
 # clear sys.path
 # clear sys.argv
 # clear sys.ps1
 # clear sys.ps2
 # clear sys.exitfunc
 # clear sys.exc_type
 # clear sys.exc_value
 # clear sys.exc_traceback
 # clear sys.last_type
 # clear sys.last_value
 # clear sys.last_traceback
 # clear sys.path_hooks
 # clear sys.path_importer_cache
 # clear sys.meta_path
 # clear sys.flags
 # clear sys.float_info
 # restore sys.stdin
 # restore sys.stdout
 # restore sys.stderr
 # cleanup __main__
 # cleanup [1] cStringIO
 # cleanup [1] __future__
 # cleanup [1] _collections
 # cleanup [1] encodings
 # cleanup [1] site
 # cleanup [1] atexit
 # cleanup [1] shutil
 # cleanup [1] _heapq
 # cleanup [1] _weakref
 # cleanup [1] abc
 # cleanup [1] _bisect
 # cleanup [1] _weakrefset
 # cleanup [1] tempfile
 # cleanup [1] binascii
 # cleanup [1] sre_constants
 # cleanup [1] collections
 # cleanup [1] _codecs
 # cleanup [1] _warnings
 # cleanup [1] math
 # cleanup [1] operator
 # cleanup [1] fnmatch
 # cleanup [1] codecs
 # cleanup [1] re
 # cleanup [1] _struct
 # cleanup [1] thread
 # cleanup [1] keyword
 # cleanup [1] signal
 # cleanup [1] random
 # cleanup [1] itertools
 # cleanup [1] encodings.aliases
 # cleanup [1] exceptions
 # cleanup [1] heapq
 # cleanup [1] sre_compile
 # cleanup [1] _sre
 # cleanup [1] _random
 # cleanup [1] hashlib
 # cleanup [1] bisect
 # cleanup [1] sre_parse
 # cleanup [1] _hashlib
 # cleanup [2] copy_reg
 # cleanup [2] iu
 # cleanup [2] os.path
 # cleanup [2] archive
 # cleanup [2] struct
 # cleanup [2] errno
 # cleanup [2] imp
 # cleanup [2] _abcoll
 # cleanup [2] ntpath
 # cleanup [2] nt
 # cleanup [2] genericpath
 # cleanup [2] stat
 # cleanup [2] zipimport
 # cleanup [2] warnings
 # cleanup [2] UserDict
 # cleanup [2] types
 # cleanup [2] zlib
 # cleanup [2] linecache
 # cleanup [2] os
 # cleanup [2] marshal
 # cleanup sys
 # cleanup __builtin__
 # cleanup ints: 41 unfreed ints
 # cleanup floats: 31 unfreed floats
 Back to parent ...
 Freeing status for C: \ Users \ tomas \ Dropbox \ Broadnet \ address_cleaner \ dist \ Address cleaner.exe

So now I see an exception to iu.py there, but I still don't know why. I also find it rather cryptic that the python file in my Downloads / py-installer folder is running, even if I delete this folder.

So, to summarize - what steps should I take to find out why the application crashes on startup?


I am using PyInstaller 2.0 with Python 2.7.3 on Windows 8. None of these facts cause this error, since I am successfully creating another project.

+6
source share
2 answers

Pyinstaller sometimes needs explicit links in the .spec file in order to properly install dependencies .

For more information, see providing the correct import instructions so that pyinstaller recognizes them .

For example, it is very easy to skip critical dependencies if they are imported from outside one of your Python modules (for example, from a jar or C ++ file that pyinstaller will not read).

Dependent walker may be your first line of defense to systematically track missing DLLs. Just download it and then download the exe or related DLLs to see which ones are missing. Then it's just a wild goose chase tracking them and manually adding them to your directory along with .exe (assuming that your packaging is in the same directory).

As a side note for pyinstaller 2.1 (python 2.7.6), I modified the pyi_importers.py file to at least try and print which module was the cause of the import problems:

 # line 409 of Pyinstaller.loader.pyi_importers.py try: module = imp.load_module(fullname, fp, filename, self._c_ext_tuple) except Exception as e: print fullname # at least tells you what module couldn't be imported raise e 

Then, knowing where the error occurred, you can indicate the problem using the walking dependencies to fix the missing DLLs.

+1
source

I know that this answer does not answer how to debug such problems, so I will not mark it as correct, but I managed to create the application and I thought I had to share how to do it. I did three things, each of which could be the cause of the error, but we will never know:

0
source

All Articles