如何调试不起作用的PyInstaller生成?

2024-05-14 22:32:35 发布

您现在位置:Python中文网/ 问答频道 /正文

我以前只使用过一次PyInstaller,它在wxPython上非常直接。不过,我目前正在尝试建立一个不同的项目。从命令行运行时,该项目运行良好。但是,在它构建之后,它永远不会启动主窗口(wxPython)。

我已经在构建规范中将调试和控制台标志设置为True。我还添加了PyInstaller手册指定的详细选项([('v', '', 'OPTION')])。这是规格说明:

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

现在,当我运行生成的可执行文件时,会得到以下输出:

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

所以现在我看到iu.py提出了一个例外,但是我仍然不知道为什么。我还发现运行Downloads/py installer文件夹中的python文件非常神秘,即使我删除了该文件夹。

所以总结一下-我需要采取哪些步骤才能弄清楚应用程序在启动时崩溃的确切原因?


我在Windows 8上使用PyInstaller 2.0和python2.7.3。当我正在成功地构建另一个项目时,这些事实本身都不会导致这个错误。


Tags: pathinpyimportossysexeusers
2条回答

Pyinstaller sometimes needs explicit references in the .spec file to correctly package dependencies

有关详细信息,请参见ensuring proper import statements so that pyinstaller recognizes them

例如,如果从Python模块的外部导入关键依赖项(例如,从pyinstaller不会读取的jar或c++文件),则很容易忽略这些依赖项。

dependency walker可能是系统跟踪丢失的dll的第一道防线。只需下载它,然后加载您的exe或关联的dll,以查看哪些dll缺少依赖项。然后,它只是一个雁行追踪他们下来,并手动添加到您的目录连同.exe(假设您的包装在一个目录)。

另外,对于pyinstaller 2.1(python2.7.6),我修改了pyi_importers.py文件,以便在导入时至少尝试并打印出哪个模块是问题的制造者:

# 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

然后,知道问题发生在哪里,您就可以用依赖性walker来定位问题,以找出丢失的dll。

我知道这个答案不能回答如何调试这样的问题,所以我不会将其标记为正确的,但是我成功地构建了应用程序,我想我应该分享一下如何进行调试。我做了三件事,每件事都可能是错误的原因,但我们永远不会知道:

  • 我用正式的Python 2.7.3替换了activepython2.7.3。
  • 我用纯python的drop-in替换pymysql替换了MySQLdb
  • 我用非常相似的方法^{}替换了Levenshtein

相关问题 更多 >

    热门问题