这几天利用xgboost算法的XGBClassifier写一个图像识别分类器,将分类器模型保存成为pkl文件模式。利用tkinter做界面,利用pycharm运行的时候非常成功,但是利用pyinstaller打包成exe的时候就遇到各种bug了,废话不多说,下面就说我遇到了什么问题以及我是怎么解决的吧。
一、缺少xgboost等模块
关于这个问题,我集结了网上的多种答案,最终修改了pathex、hiddenimports这两个参数。利用Natepad++打开生成的spec文件,修改pathex、hiddenimports这两个参数:
block_cipher = None
a = Analysis(['MainExe.py'],
pathex=[ 'F:\\train_code',
'C:\\ProgramData\\Anaconda3\\envs\\\tensorflow\\Lib\\site-packages\\xgboost\\lib',
'C:\\ProgramData\\Anaconda3\\envs\\\tensorflow\\Lib\\site-packages\\xgboost-1.3.3.dist-info',
'C:\\ProgramData\\Anaconda3\\envs\\\tensorflow\\Lib\\site-packages\\xgboost',
'C:\\ProgramData\\Anaconda3\\envs\\\tensorflow\\Lib\\site-packages\\numpy\\core',
'C:\\ProgramData\\Anaconda3\\envs\\\tensorflow\\Lib\\site-packages\\numpy\\random',
'C:\\ProgramData\\Anaconda3\\envs\\tensorflow\\Lib\\site-packages\\sklearn',],
binaries=[],
datas=[],
hiddenimports=["numpy","numpy.core._dtype_ctypes","xgboost","sklearn"],
……
pathex:后面添加的是所缺少模块在电脑上的安装位置,我因为缺少了xgboost、numpy和sklearn模块,以防万一我把有关的三个模块的路径都给整进去了;
hiddenimports:后面添加的是所缺少的模块的名称。
二、找不到xgboost.dll文件
这里是参考:pyinstaller打包含xgboost的.py脚本 报错xgboost.libpath.XGBoostLibraryNotFound: Cannot find XGBoost Library…这位博主的方案得到解决的。我这里主要是修改binaries,datas这两个参数。利用Natepad++打开生成的spec文件,修改binaries,datas为:
from PyInstaller.utils.hooks import collect_submodules
from PyInstaller.utils.hooks import collect_data_files
block_cipher = None
data = collect_data_files('xgboost')
a = Analysis(['MainExe.py'],
pathex=[ 'F:\\train_code'],
binaries=data,
datas=data,
hiddenimports=[],
……
三、UnpicklingError:NEWOBJ类参数不是obj类型
这里开始训练好模型之后我是利用pickle将模型保存成pkl文件的,加载模型的时候需要用到pickle.load()语句,这里在pycharm上运行完成没问题,但是打包之后出现了以下问题。
对于这个问题网上好像没有说明过多的解决方案,我自己也搞不定。所以我就换一种思路,就是能不能用别的办法将模型保存成为pkl文件,于是还真有,下面是借鉴这位博主的:scikit-learn中如何保存模型的办法,将pickle改成joblib去保存和加载pkl文件,就好啦。
解决了以上问题之后,我的exe就终于打包完成并成功运行啦!