pyinstaller打包成exe运行缺少module的解决办法

这几天利用xgboost算法的XGBClassifier写一个图像识别分类器,将分类器模型保存成为pkl文件模式。利用tkinter做界面,利用pycharm运行的时候非常成功,但是利用pyinstaller打包成exe的时候就遇到各种bug了,废话不多说,下面就说我遇到了什么问题以及我是怎么解决的吧。

一、缺少xgboost等模块

pyinstaller打包成exe运行缺少module的解决办法_第1张图片在这里插入图片描述
关于这个问题,我集结了网上的多种答案,最终修改了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打包成exe运行缺少module的解决办法_第2张图片
这里是参考: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上运行完成没问题,但是打包之后出现了以下问题。
pyinstaller打包成exe运行缺少module的解决办法_第3张图片
对于这个问题网上好像没有说明过多的解决方案,我自己也搞不定。所以我就换一种思路,就是能不能用别的办法将模型保存成为pkl文件,于是还真有,下面是借鉴这位博主的:scikit-learn中如何保存模型的办法,将pickle改成joblib去保存和加载pkl文件,就好啦。
解决了以上问题之后,我的exe就终于打包完成并成功运行啦!

你可能感兴趣的:(python,机器学习,tensorflow)