如何调试不起作用的PyInstaller构建



我以前只使用过PyInstaller一次,它与wxPython的配合非常直接。不过,我目前正在尝试构建一个不同的项目。从命令行运行时,该项目运行良好。然而,在构建之后,它从未启动主窗口(wxPython)。

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

#-*-mode:python-*-#basedir=os.path.realpath(os.path.dirname(__file__))basedir=os.getcwd()#构建图标toc。icons_toc=[]对于os.walk中的目录(os.path.join(basedir,'icons')):对于目录[2]中的图标:出现图标((os.path.join('cons',icon),os.path.join(dir[0],图标),'数据',))a=分析([‘application.py’],pathex=['.','./lib','../broadpy/lib'、'../broddy/vendor'],hiddenimports=[],hookspath=无)a.datas+=图标pyz=pyz(a.pure)exe=exe(pyz,a.scripts+[('v','','OPTION')],a.二进制,a.zip文件,a.数据,name=os.path.join("dist","地址清理器.exe"),debug=True,strip=无,upx=真,console=真)app=束(exe,name=os.path.join('dist','地址清理器.app'))

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

C:\Users\tomas\Dropbox\Broadnet\address_cleaner>"C:\Users\tomas\Dropbox \ Broadnet\aaddress_cleaner\dist\address cleaner.exe"_MEIPASS2为空archivename为C:\Users\tomas\Dropbox\Broadnet\address_cleaner\dist\address-cleaner.exe正在提取二进制文件将自己作为子级执行,并设置为运行子级正在创建子进程正在等待子进程完成。。。_MEIPASS2是C:\Users/tomas/AppData/Local/Temp/MEI30762/archivename为C:\Users\tomas\Dropbox\Broadnet\address_cleaner\dist\address-cleaner.exe已经在孩子跑步了!manifestpath: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/distPYTHONHOME=C:/Users/tomas/AppData/Local/Temp/MEI30762/v#安装拉链挂钩import-zipimport#builtin#已安装拉链挂钩从CArchive导入模块导入封送#builtin提取iu导入imp#builtin导入nt#内置提取的结构import_struct#内置提取的档案安装导入挂钩out00-PYZ.PYZ正在运行脚本导入zlib#builtin导入errno#builtinimport_weakref#内置import_codecs#内置import_sre#内置import_collections#builtin导入运算符#builtin导入itertools#builtinimport_bisect#builtinimport_heapq#内置导入线程#builtin导入数学#builtin导入binascii#builtinimport_hashlib#从C:\Users\tomas\AppData\Local\Temp\_MEI30762\_hashlib.pyd动态加载import_random#内置导入cStringIO#内置追踪(最近一次通话):文件",第65行,在importHook中的文件"C:\Users\tomas\Downloads\pyinstaller-2.0\pyinstaller\loader\iu.py",第386行文件"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行,位于importHook中的文件"C:\Users\tomas\Downloads\pyinstaller-2.0\pyinstaller\loader\iu.py",第386行文件"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:-1来自pyy_rth_win32comgenpy好啊停用激活上下文正在释放激活上下文完成#清除__内置___#清除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#清除系统标志#清除系统float_info#还原sys.stdin#恢复sys.stdout#还原sys.stderr#清理__main__#清除[1]cStringIO#清理[1]__未来__#cleanup[1]_集合#cleanup[1]编码#清理[1]场地#清除#清理[1]shutil#清除[1]_heapq#cleanup[1]_weakref#清理作业#清除[1]_bisect#cleanup[1]_weakrefset#清除[1]临时文件#清理#清除[1]sre_stants#清理[1]集合#cleanup[1]_codecs#cleanup[1]_警告#清除[1]数学#cleanup[1]运算符#cleanup[1]fnmatch#清除[1]编解码器#清理[1]re#cleanup[1]_struct#清理[1]线程#cleanup[1]关键字#清除[1]信号#清除[1]随机#cleanup[1]itertools#cleanup[1]编码.别名#cleanup[1]异常#清理[1]heapq#cleanup[1]sre_compile#清除[1]_sre#清除[1]_random#cleanup[1]hashlib#清除[1]平分线#清除[1]sre_parse#cleanup[1]_hashlib#cleanup[2]复制#清理#清理[2]os.path#清理[2]档案#cleanup[2]结构#cleanup[2]错误号#清除[2]imp#清除[2]_abcoll#cleanup[2]ntpath#清除[2]nt#cleanup[2]泛型路径#清除[2]统计#cleanup[2]zip导入#cleanup[2]警告#cleanup[2]用户词典#清除[2]类型#cleanup[2]zlib#cleanup[2]行缓存#清理操作系统#清理[2]封送#清理系统#清除__内置__#清除整数:41个未解冻整数#清除浮动:31个未解冻的浮动返回父级。。。C:\Users\tomas\Dropbox\Broadnet\address_cleaner\dist\address cleaner.exe的释放状态

所以现在我看到iu.py出现了一个引发的异常,但我仍然不知道为什么。我还发现,即使我删除了下载/py安装程序文件夹中的一个python文件,它也会运行,这很神秘。

总之,我需要采取哪些步骤才能弄清楚应用程序在启动时崩溃的确切原因?


我在Windows 8上使用PyInstaller 2.0和Python 2.7.3。由于我正在成功地构建另一个项目,这些事实都没有单独导致这个错误。

Pyinstaller有时需要.spec文件中的显式引用来正确打包依赖项。

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

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

依赖助行器可能是系统地跟踪丢失DLL的第一道防线。只需下载它,然后加载你的exe或附属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

然后,知道问题发生在哪里,就可以使用依赖性助行器来指出问题,从而根除丢失的DLL。

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

  • 我用官方的Python 2.7.3替换了ActivePython 2.7.3
  • 我用纯python drop-in替换pymysql替换了MySQLdb
  • 我用非常相似的方法difflib.SequenceMatcher.ratio代替了Levenstein

最新更新