1.背景介绍:
尝试在Win10,64位系统,Python3.6环境下,用Pyinstaller打包生成可执行文件exe时,多次报错。本文介绍如何一一解决这些bug。
打包的源代码地址:https://github.com/Hu-WF/MachineLearningProject
代码中包括scikit-learn,Pandas,Scipy,matplotlib,numpy等常用机器学习相关库,以及TKinter库。(为便于阐述,下文中统一将要打包的主程序称为myGUI.py)。(总共约有2000行代码)
首先通过pip install pyinstaller指令安装好pyinstaller3.3.1版本,然后在start.py所在的文件夹内,按住shift+鼠标右键,在此处打开命令窗口,输入pyinstaller myGUI.py,即可开始打包。
2.BUG一号:Maximum recursion depth exceeded(系统递归层数溢出)
这个问题还是比较好解决的,直接打开生成的myGUI.spec(注意,是.spec文件,不是.py文件),然后在代码首部插入:
import sys
sys.setrecursionlimit(10000)
强制增加系统的递归层数,即可解决该bug。然后接下来再打包时都用pyinstaller myGUI.spec(注意,是.spec文件,不是.py文件!)效果如下:
chcp 65001
即可将控制台编码格式转换成UTF-8。
4.BUG三号:Cannot find PyQt5 plugin directories(找不到PyQT5)
这个bug刚开始还觉得挺莫名其妙的,因为我的代码中根本没有涉及到PyQT5,也没有import任何相关库。后来查了很多资料,了解到pyinstaller的打包原理和过程才有点明白为什么会报这个错误,具体就不展开叙述了,感兴趣的话可以自己查一下。 遇到这个bug后,我首先尝试pip install pyqt5,重点来了,这时候报错说sip有问题。这是因为python3.6环境下,pyqt5和sip没有做版本适应。网上查了一下,都说得把python3.6回滚到python3.5下才可以,不过这样太麻烦了。我的解决办法是:首先在自己的Anaconda安装目录下D:\Anaconda3510\Lib\site-packages\,找到PyQT5这个文件夹,直接删除,然后再去pip install pyqt5,这时候就能成功安装pyqt5!
在解决完三号bug后,就能完整打包完一个exe文件了。
5.BUG四号:生成的start.exe闪退,报错No Module named sklearn.neighbors.typedefs
解决方案:重新打包,打包命令修改为:
pyinstaller --hidden-import sklearn.neighbors.typedefs myGUI.spec
## 注意,是.spec文件
再次运行,可能还会闪退,那就根据闪退报错的提示信息进行相同的处理。可能会遇到类似下面的bug:
#根据报错增加hidden import即可
pyinstaller --hidden-import sklearn.neighbors.typedefs --hidden-import sklearn.neighbors.quad_tree myGUI.spec
后来发现,可以直接打开.spec文件,直接对hiddenimports列表添加字符串元素即可达到同样的效果,如下图所示:
根据我自己的报错,我最终将其改为了:
hiddenimports=['sklearn.tree._utils','sklearn.neighbors.typedefs','sklearn.neighbors.ball_tree','sklearn.neighbors.dist_metrics','sklearn.neighbors.quad_tree'],
然后直接在cmd中输入:
pyinstaller myGUI.spec
即可正常打包并且完美运行!GUI界面如下所示:(这个GUI用TKinter做的,有点丑)
.spec还有很多隐藏功能,可以控制整个打包过程,如是否生成控制台console等,这里就不再一一介绍了。
本文到此结束。若在打包过程中遇到其他问题无法解决的,欢迎交流。