12

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

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

# -*- 模式: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。这些事实都不会导致这个错误,因为我正在成功构建另一个项目。

4

2 回答 2

6

Pyinstaller 有时需要在 .spec 文件中明确引用才能正确打包依赖项

有关更多信息,请参阅确保正确的导入语句以便 pyinstaller 识别它们

例如,如果它们是从您的 Python 模块之一外部导入的(例如,从 pyinstaller 不会读取的 jar 或 c++ 文件),则很容易错过关键依赖项。

依赖遍历器可能是您系统地跟踪丢失的 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。

于 2014-06-05T17:19:17.800 回答
2

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

于 2012-12-09T15:50:55.957 回答