windows使用pyinstaller 打包sklearn模块出现死循环报错
前言
解决这个让我花费了很长时间, 我这里说的死循环,不是正常通过 --hidden-import
能解决的问题. 因为我也查询了很多资料 但是无一例外都失败了(能通过 –hidden-import 解决的问题这里我就不详细叙述了)
这里我简单列举一下我查询到的 解决方案:
方案 | 结果 |
---|---|
1. 在导入sklearn前面引入from multiprocessing import freeze_support; freeze_support() | 失败 |
2. 更改打包主入口文件 *.spec(修改一些配置) | 失败 |
3.在导入sklearn前面引入import sklearn.neighbors.typedefs | 失败 |
问题描述
我用PyQt5 结合的sklearn,打包后解决了所有 --hidden-import
和包括缺少 dll
的错误. 然后打包后正常启动了图形化界面,然后开始疯狂循环(弹出窗口),cmd 也是开始疯狂输出错误,只能强制 ctrl+c
问题解决
我更换了我的scikit-learn
版本
pip install scikit-learn==0.19.2
在启动的时候会有一个输出
C:\Python36-32\lib\site-packages\sklearn\externals\joblib\parallel.py:547: UserWarning: Multiprocessing-backed parallel loops cannot be nested below threads, setting n_jobs=1
**self._backend_args)
经过我反复测试,只要有这个输出,打包后就不会出现死循环报错, sklearn运行的速度也会快一些(我也不知道为什么)
经过实验 scikit-learn < 0.21.0
的版本都可以成功,我这里用的是 0.19.2
默认不指定版本安装的是 0.22.0
我的最终打包脚本
pyinstaller -w main_ui.py --hidden-import sklearn.neighbors.typedefs --hidden-import sklearn.utils._cython_blas --hidden-import sklearn.neighbors.quad_tree --hidden-import sklearn.tree --hidden-import sklearn.tree._utils
这里如果你想要调试应该去掉 -w
参数,这样可以在终端输出一些报错, 无窗口模式直接弹窗报一个失败执行脚本
你完全不知道什么地方出错了
其他
其实用pyinstaller
打包了这么多软件,今天我才 感觉不应该使用 -F
选项,因为打包成一个文件执行效率会低很多,但是如果不打包成一个文件的话,一大堆文件显得非常凌乱. 我终于发现应该将他们做成一个安装包,就像正常你安装 windows上的一些软件一样,可以使用 advanced installer来将他们做成一个安装包
本文来自博客园,作者:Hello_wshuo,转载请注明原文链接:https://www.cnblogs.com/Hellowshuo/p/15622175.html