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

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

 

 

 

 

 

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:

#根据报错增加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等,这里就不再一一介绍了。

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

----------------------------------------------------------------------------------------------------------------------------------------------------------------------

2020.02.09更新

01.解决打包完成后,点击exe会先弹出dos黑窗再打开界面的问题

    解决办法:打开myGUI.spec文件,将console由True改为False,再重新打包即可。

02.解决pyinstaller打包生成的exe文件过大的方法之一

    解决思路:在默认环境下,pyinstaller打包会把所有第三方库都打包进去,造成文件过大。因此,在Anaconda的Anaconda Prompt中创建新的conda环境,仅安装打包程序所需的库,然后在该环境下运行pyinstaller进行打包即可有效降低exe大小。

03.BUG五号使用Tkinter建立窗口,使用matplotlib绘图时出现:This probably means that Tcl wasn’t installed properly

    原因:tkinter和matplotlib在程序中的import顺序不对。

    解决办法:把myGUI.py中的程序改为先import matplotlib,再import tkinter即可。

04.尽量使用-D<包含外部dll的exe>的打包方式,而不是-F<所有文件打包成一个exe>的打包方式,这样打开exe速度会更快。打包指令为:

pyinstaller -D -w myGUI.spec

05.Anaconda创建新conda、启动、停止conda方法

1.打开conda prompt;
2.输入conda create -n environment_name python=X.X  # 创建指定名称、python版本的conda环境;
3.输入activate environment_name  # 打开新建的conda,可进行pip list、pip install等常规操作;
4.输入conda activate base  # 打开默认conda
4.输入conda remove --name environment_name --all  # 删除conda环境

06.打包exe后无法运行,可能是部分第三方库版本过新的问题,应尝试降低版本的操作

    例如,默认tensorflow为 2.×.×版本,导致无法运行,尝试pip install tensorflow==1.14.0降低版本,并重装keras后,即解决了闪退问题。

 

 

 

 

  • 2
    点赞
  • 4
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值