【问题标题】:How do I debug a non-functioning PyInstaller build?如何调试无法运行的 PyInstaller 构建?
【发布时间】:2014-07-07 17:09:40
【问题描述】:

我以前只使用过一次 PyInstaller,它与 wxPython 一起工作非常简单。不过,我目前正在尝试构建一个不同的项目。从命令行运行时,该项目运行良好。然而,在它构建之后,它永远不会启动主窗口 (wxPython)。

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

# -*- 模式:python -*- # basedir = os.path.realpath(os.path.dirname(__file__)) basedir = os.getcwd() # 构建图标 toc. 图标目录 = [] 对于 os.walk(os.path.join(basedir, 'icons')) 中的目录: 对于 dir[2] 中的图标: icons_toc.append( ( os.path.join('icons', icon), os.path.join(dir[0], 图标), '数据', ) ) 一=分析( ['应用程序.py'], pathex=['.', './lib', '../broadpy/lib', '../broadpy/vendor'], 隐藏进口=[], hookspath=无 ) a.datas += icons_toc pyz = PYZ(a.pure) 执行程序 = 执行程序( 皮兹, a.scripts + [('v', '', 'OPTION')], a.二进制文件, a.zip 文件, a.数据, 名称=os.path.join( 'dist', '地址清洁器.exe' ), 调试=真, 条=无, upx=真, 控制台=真 ) 应用程序=捆绑( 可执行程序, name=os.path.join('dist', '地址清理器.app') )

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

C:\Users\tomas\Dropbox\Broadnet\address_cleaner>"C:\Users\tomas\Dropbox\Broadnet\address_cleaner\dist\Address cleaner.exe"
_MEIPASS2 为 NULL
存档名称是 C:\Users\tomas\Dropbox\Broadnet\address_cleaner\dist\Address cleaner.exe
提取二进制文件
通过设置运行孩子执行自我作为孩子
创建子进程
等待子进程完成...
_MEIPASS2 是 C:/Users/tomas/AppData/Local/Temp/_MEI30762/
存档名称是 C:\Users\tomas\Dropbox\Broadnet\address_cleaner\dist\Address cleaner.exe
已经在孩子 - 运行!
清单路径:C:/Users/tomas/AppData/Local/Temp/_MEI30762/Address cleaner.exe.manifest
创建的激活上下文
激活上下文已激活
C:/Users/tomas/AppData/Local/Temp/_MEI30762/python27.dll
操纵环境
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
# 安装 zipimport 钩子
导入 zipimport # 内置
# 安装 zipimport 钩子
从 CArchive 导入模块
导入元帅#内置
提取iu
导入 imp # 内置
导入 nt # 内置
提取结构
导入 _struct # 内置
提取档案
安装导入钩子
out00-PYZ.pyz
运行脚本
导入 zlib # 内置
导入 errno # 内置
导入 _weakref # 内置
导入 _codecs # 内置
导入 _sre # 内置
导入 _collections # 内置
导入运算符#内置
导入 itertools # 内置
导入 _bisect # 内置
导入 _heapq # 内置
导入线程#内置
导入数学#内置
导入 binascii # 内置
import _hashlib # 从 C:\Users\tomas\AppData\Local\Temp\_MEI30762\_hashlib.pyd 动态加载
导入 _random # 内置
导入 cStringIO # 内置
回溯(最近一次通话最后):
  文件“”,第 65 行,在
  文件“C:\Users\tomas\Downloads\pyinstaller-2.0\PyInstaller\loader\iu.py”,第 386 行,在 importHook
  文件“C:\Users\tomas\Downloads\pyinstaller-2.0\PyInstaller\loader\iu.py”,第 480 行,在 doimport
  文件“C:\Users\tomas\Dropbox\Broadnet\address_cleaner\build\pyi.win32\buildspec\out00-PYZ.pyz\win32com”,第 5 行,在
  文件“C:\Users\tomas\Downloads\pyinstaller-2.0\PyInstaller\loader\iu.py”,第 386 行,在 importHook
  文件“C:\Users\tomas\Downloads\pyinstaller-2.0\PyInstaller\loader\iu.py”,第 459 行,在 doimport
  文件“C:\Users\tomas\Downloads\pyinstaller-2.0\PyInstaller\loader\iu.py”,第 248 行,在 getmod
  文件“C:\Users\tomas\Downloads\pyinstaller-2.0\PyInstaller\loader\iu.py”,第 105 行,在 getmod
ImportError:DLL 加载失败:找不到指定的模块。
RC:来自 pyi_rth_win32comgenpy 的 -1
好的。
停用激活上下文
释放激活上下文
完毕
# 清除 __builtin__._
# 清除 sys.path
# 清除 sys.argv
# 清除 sys.ps1
# 清除 sys.ps2
# 清除 sys.exitfunc
# 清除 sys.exc_type
# 清除 sys.exc_value
# 清除 sys.exc_traceback
# 清除 sys.last_type
# 清除 sys.last_value
# 清除 sys.last_traceback
# 清除 sys.path_hooks
# 清除 sys.path_importer_cache
# 清除 sys.meta_path
# 清除 sys.flags
# 清除 sys.float_info
# 恢复 sys.stdin
# 恢复 sys.stdout
# 恢复 sys.stderr
# 清理 __main__
# 清理[1] cStringIO
# 清理[1] __future__
# 清理[1] _collections
# cleanup[1] 编码
# 清理 [1] 站点
# 清理[1] atexit
# 清理[1] 关闭
# 清理[1] _heapq
# 清理[1] _weakref
# 清理[1] abc
# 清理[1] _bisect
# 清理[1] _weakrefset
# cleanup[1] 临时文件
# 清理[1] binascii
# 清理[1] sre_constants
# cleanup[1] 集合
# 清理[1] _codecs
# 清理[1] _warnings
# cleanup[1] 数学
# cleanup[1] 运算符
# 清理[1] fnmatch
# cleanup[1] 编解码器
# 清理 [1] 重新
# 清理[1] _struct
# cleanup[1] 线程
# cleanup[1] 关键字
# cleanup[1] 信号
# 清理[1] 随机
# 清理[1] 迭代工具
# cleanup[1] encodings.aliases
# cleanup[1] 异常
# cleanup[1] heapq
# 清理[1] sre_compile
# 清理[1] _sre
# 清理[1] _random
# 清理[1] 哈希库
# cleanup[1] 平分
# 清理[1] sre_parse
# 清理[1] _hashlib
# 清理[2] copy_reg
# 清理[2] iu
# 清理[2] os.path
# cleanup[2] 存档
# cleanup[2] 结构体
# 清理[2] 错误号
# 清理[2] 小鬼
# 清理[2] _abcoll
# 清理[2] ntpath
# 清理[2] nt
# cleanup[2] 通用路径
# 清理[2] 统计
# 清理[2] zipimport
# cleanup[2] 警告
# 清理[2] 用户字典
# 清理[2] 类型
# 清理[2] zlib
# 清理[2] 行缓存
# 清理[2] 操作系统
# cleanup[2] 元帅
# 清理系统
# 清理 __builtin__
# 清理整数:41 个未释放的整数
# 清理浮动:31 个未释放的浮动
回到父...
C:\Users\tomas\Dropbox\Broadnet\address_cleaner\dist\Address cleaner.exe 的释放状态

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

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


我在 Windows 8 上使用 PyInstaller 2.0 和 Python 2.7.3。这些事实都不会导致此错误,因为我正在成功构建另一个项目。

【问题讨论】:

    标签: python pyinstaller


    【解决方案1】:

    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 以查看哪些缺少依赖项。然后,追踪它们并手动将它们与 .exe 一起添加到您的目录中(假设您的包装在一个目录中)。

    作为旁注,对于 pyinstaller 2.1 (python 2.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
    

    然后,知道问题发生在哪里,然后您可以使用依赖项遍历器确定问题以根除丢失的 DLL。

    【讨论】:

    • 解决我的问题的是在 WinXP 上重新编译一个 pyd 模块(特别是针对 pcapy),并将其复制到我的 Windows 7 python 安装中。现在我在 Windows 7 上构建的 pyinstaller exe 也可以在 Windows XP 和 Windows 7 上运行
    • 您或许可以帮我解决我的problem
    【解决方案2】:

    我知道这个答案没有回答如何调试这样的问题,所以我不会将其标记为正确,但我设法构建了应用程序,我认为我应该分享如何。我做了三件事,每件事都可能是导致错误的原因,但我们永远不会知道:

    【讨论】:

      猜你喜欢
      • 2023-01-26
      • 1970-01-01
      • 1970-01-01
      • 2021-01-13
      • 2023-03-18
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2022-01-14
      相关资源
      最近更新 更多