01.Win10,64位,Python3.6下用Pyinstaller3.3.1打包含有scikit-learn,TKinter的程序踩坑总结(2018.6.30)

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文件!)效果如下:

01.Win10,64位,Python3.6下用Pyinstaller3.3.1打包含有scikit-learn,TKinter的程序踩坑总结(2018.6.30)_第1张图片

3.BUG二号:UnicodeDecodeError: ‘utf-8’ codec can’t decode byte(控制台编码格式不是UTF-8)
    这是因为我的代码中含有中文注解,因此报错。解决办法也很简单,在开始打包之前,先在控制台中输入:
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:

01.Win10,64位,Python3.6下用Pyinstaller3.3.1打包含有scikit-learn,TKinter的程序踩坑总结(2018.6.30)_第2张图片

01.Win10,64位,Python3.6下用Pyinstaller3.3.1打包含有scikit-learn,TKinter的程序踩坑总结(2018.6.30)_第3张图片

#根据报错增加hidden import即可
pyinstaller --hidden-import sklearn.neighbors.typedefs --hidden-import sklearn.neighbors.quad_tree myGUI.spec

后来发现,可以直接打开.spec文件,直接对hiddenimports列表添加字符串元素即可达到同样的效果,如下图所示:

01.Win10,64位,Python3.6下用Pyinstaller3.3.1打包含有scikit-learn,TKinter的程序踩坑总结(2018.6.30)_第4张图片

根据我自己的报错,我最终将其改为了:

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做的,有点丑)

01.Win10,64位,Python3.6下用Pyinstaller3.3.1打包含有scikit-learn,TKinter的程序踩坑总结(2018.6.30)_第5张图片

    .spec还有很多隐藏功能,可以控制整个打包过程,如是否生成控制台console等,这里就不再一一介绍了。

本文到此结束。若在打包过程中遇到其他问题无法解决的,欢迎交流。




你可能感兴趣的:(其他:技术总结)