详解pyinstaller生成exe的闪退问题解决方案


Posted in Python onJune 19, 2020

简单模块问题

如果在 pyinstaller project.py 的过程中,出现:

No module named 'xxx'

那就 pip install xxx 就行,比如:

$ pip install wxPython pypiwin32 tornado

这个 pip 对应于项目的虚拟环境。
其中 wxPython 对应 No module named 'wx'
其中 pypiwin32 对应 No module named 'win32com'
还有个老生常谈的小问题,提一下,避免萌新看的一头雾水,比如有些包有别名,比如你并不能通过 pip install wx 来解决 No module named 'wx' 的问题。这需要一些经验,没经验的这些去搜索引擎搜索搜索就知道了,基本解决方法都是 pip install ...,其中 ... 是这个模块的真名。

全网唯一答案系列

以上都是简单的问题,如果不会出现 No module named xxx 的问题,就不用关心 pip install 了。
再遇到闪退等问题可以加上命令参数 -D
pyinstaller -D project.py,表示我们打包成一个文件夹,而不仅仅是个 exe 文件,当然这个项目文件夹在 dist 下面。

在每次重新打包之前,务必删除项目中的 builddist 目录。

这时候还会碰到一些棘手的问题,比如:

详解pyinstaller生成exe的闪退问题解决方案

看最后的异常提示是 PyInstallerImportError 错误,可以看到 sklearn 下面缺少 .libs/vcomp140.dll 文件,这是因为 pyinstaller 的执行过程中,没有把虚拟环境(你的项目开发环境中 Lib/site-packages/ 内的包)中的该依赖文件(vcomp140.dll)打包进来,这时候去原本我们的虚拟环境中找到这个文件,复制出来,粘贴进我们这个打包生成的文件夹内对印的 ./sklearn 目录下的对应位置,但是我们看到这个目录下面居然没有 .libs 文件夹,那就在这里(./sklearn)创建一个,然后把那个缺的依赖文件(vcomp140.dll)复制进来就行。
可能看的会有点晕,这里需要耐心点看,为了避免文字过多产生的表达歧义,再强调一下思路:「把生成的项目文件夹中缺失的依赖文件,如 dll 文件;从开发环境中的包里找到它,并复制进来。」

打包调试的时候需要注意不要隐藏控制台,不然拿不到错误信息,无法进行下一步 debug 操作。

我们可以看到这个问题被解决了,但是会有新的问题,基本都是 sklearn 的问题,这里只是枚举我发生的问题,如果你写的是别的项目,库依赖也很严重,也会有这些问题,可能不是 sklearn,总之肯定是某个包缺失依赖文件或模块文件的问题。

现在来看看新的报错信息:

详解pyinstaller生成exe的闪退问题解决方案

这个问题基本全网的答案都是诸如修改 project.spec 文件中的 a=Analysis(...) 选项的 hiddenimports 配置:

hiddenimports=['cython', 'sklearn', 'sklearn.utils._cython_blas'],

然后删除 builddist 后执行:

$ pyinstaller -D project.spec

或者是直接给 pyinstaller 命令加参数,比如这样:

$ pyinstaller -F -w --hidden-import='sklearn.utils._cython_blas' --hidden-import='sklearn.neighbors.typedefs' --hidden-import='sklearn.neighbors.quad_tree' --hidden-import='sklearn.tree' --hidden-import='sklearn.tree._utils' project.py

如果你用这个方法解决不了,那就尝试把缺失的模块从开发环境中的 site-packages 里复制出来粘贴进我们生成的 ./dist/project/ 里面对应的模块所在位置(如果没有找到对应的路径,不存在这个文件夹之类的,就如以上说的建一个 .libs/ 文件夹一样创建一个。)
比如我的生成项目文件夹位于:
C:\Users\Galois\Documents\project\dist\project

详解pyinstaller生成exe的闪退问题解决方案

当然,我们需要的项目可执行文件 exe 也在这个目录下。
接下来的操作基本就是对这个目录里面进行粘贴缺失的模块,根据异常报错信息,比如我们刚才得到的报错是:

ModuleNotFoundError: No module named 'sklearn.utils._cython_blas'

现在我们进入两个地方:
生成的项目中的目录:
C:\Users\Galois\Documents\project\dist\project\sklearn\utils
开发环境中的目录(由于我不知道各位开发环境怎样,这里就直接用开发环境的相对目录来说明路径):
yourenv/Lib/site-packages/skearn/utils/

在这个开发环境中的这个路径我们会看到一些 pyd 文件,我们的操作诸如这张图:

详解pyinstaller生成exe的闪退问题解决方案

我们可以看到报错中的缺失模块 ‘sklearn.utils._cython_blas' 的模块文件在这里其实被命名成了 _cython_blas.cp37-win_amd64.pyd,就是它了。

复制进来后,我们再双击生成的文件夹下的可执行文件 ./project/dist/project/project.exe,捕捉一下新的错误,一直这样捕捉错误,然后复制粘贴操作修复错误,如果没错误就成功了。除非你还有其它类型的错误。

我们又看到了新的报错:

详解pyinstaller生成exe的闪退问题解决方案

同样的方法,解决这个同样类型的错误,思路「打开开发环境对应的目录找到生成项目目录中缺失的 pyd 文件复制进生成项目目录中对应的位置」。

可能有人一遍有点懵,那我就不省略了,再重复下修复这个错误的示意图:

详解pyinstaller生成exe的闪退问题解决方案

接下来的 debug 就不详细展示了,步骤思路一摸一样,直到让可执行文件不再缺失模块为止,就成功了,最后运行下生成的可执行文件 ./dist/project/project.exe

详解pyinstaller生成exe的闪退问题解决方案

这就成功了。

到此这篇关于详解pyinstaller生成exe的闪退问题解决方案的文章就介绍到这了,更多相关pyinstaller生成exe内容请搜索三水点靠木以前的文章或继续浏览下面的相关文章希望大家以后多多支持三水点靠木!

Python 相关文章推荐
Python内置的字符串处理函数整理
Jan 29 Python
python抓取网页图片并放到指定文件夹
Apr 24 Python
Python 2.x如何设置命令执行的超时时间实例
Oct 19 Python
python爬虫之BeautifulSoup 使用select方法详解
Oct 23 Python
Python可变参数*args和**kwargs用法实例小结
Apr 27 Python
实例讲解Python中整数的最大值输出
Mar 17 Python
python3.5 cv2 获取视频特定帧生成jpg图片
Aug 28 Python
Python连接Hadoop数据中遇到的各种坑(汇总)
Apr 14 Python
Python selenium使用autoIT上传附件过程详解
May 26 Python
Python用access判断文件是否被占用的实例方法
Dec 17 Python
pytorch中的model.eval()和BN层的使用
May 22 Python
PYTHON InceptionV3模型的复现详解
May 06 Python
Python实现爬取并分析电商评论
Jun 19 #Python
keras 实现轻量级网络ShuffleNet教程
Jun 19 #Python
Python爬虫实现HTTP网络请求多种实现方式
Jun 19 #Python
Keras设置以及获取权重的实现
Jun 19 #Python
Python包和模块的分发详细介绍
Jun 19 #Python
浅谈Keras中shuffle和validation_split的顺序
Jun 19 #Python
Python爬虫headers处理及网络超时问题解决方案
Jun 19 #Python
You might like
初探PHP5
2006/10/09 PHP
虚拟主机中对PHP的特殊设置
2006/10/09 PHP
MySQL授权问题总结
2007/05/06 PHP
基于PHP 面向对象之成员方法详解
2013/05/04 PHP
php通过ksort()函数给关联数组按照键排序的方法
2015/03/18 PHP
Laravel搭建后台登录系统步骤详解
2016/07/26 PHP
Laravel项目中timeAgo字段语言转换的改善方法示例
2019/09/16 PHP
Javascript 获取滚动条位置等信息的函数
2009/09/08 Javascript
DIV外区域Click后关闭DIV的实现代码
2011/12/21 Javascript
jQuery实现的输入框选择时间插件用法实例
2015/02/28 Javascript
js仿支付宝填写支付密码效果实现多方框输入密码
2016/03/09 Javascript
Bootstrap3学习笔记(三)之表格
2016/05/20 Javascript
JavaScript必知必会(九)function 说起 闭包问题
2016/06/08 Javascript
Javascript将数值转换为金额格式(分隔千分位和自动增加小数点)
2016/06/22 Javascript
开源免费天气预报接口API及全国所有地区代码(国家气象局提供)
2016/12/26 Javascript
AngularJS中的拦截器实例详解
2017/04/07 Javascript
使用veloticy-ui生成文字动画效果
2018/02/08 Javascript
React styled-components设置组件属性的方法
2018/08/07 Javascript
微信小程序的开发范式BeautyWe.js入门详解
2019/07/10 Javascript
Vue中computed和watch有哪些区别
2020/12/19 Vue.js
[04:44]DOTA2西游记战队视频彩蛋流出 师徒开黑巧遇林书豪
2016/08/03 DOTA
python解析发往本机的数据包示例 (解析数据包)
2014/01/16 Python
python中sys.argv参数用法实例分析
2015/05/20 Python
Python单元测试及unittest框架用法实例解析
2020/07/09 Python
Python文件夹批处理操作代码实例
2020/07/21 Python
详解移动端HTML5音频与视频问题及解决方案
2018/08/22 HTML / CSS
加拿大著名时装品牌:SOIA & KYO
2016/08/23 全球购物
《自然之道》教学反思
2014/02/11 职场文书
社区护士演讲稿
2014/08/27 职场文书
政法干警核心价值观心得体会
2014/09/11 职场文书
新闻发布会活动策划方案
2014/09/15 职场文书
民主生活会对照检查材料思想汇报
2014/09/27 职场文书
2014年幼儿园老师工作总结
2014/12/05 职场文书
督导岗位职责
2015/02/04 职场文书
2015年化验室工作总结
2015/04/23 职场文书
python实现socket简单通信的示例代码
2021/04/13 Python