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

这几天利用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就终于打包完成并成功运行啦!

  • 3
    点赞
  • 24
    收藏
    觉得还不错? 一键收藏
  • 3
    评论
在使用PyInstaller打包Python应用程序时,有时会出现缺少模块的情况。这可能是因为PyInstaller没有正确地检测到您的依赖项,或者您的依赖项没有正确地被打包到可执行文件中。以下是一些可能的解决方案: 1.手动添加缺少的模块 您可以手动将缺少的模块添加到PyInstaller的spec文件中。在spec文件中,您可以使用hiddenimports参数来指定需要导入的模块。例如: ```python # main.spec # ... a = Analysis(['main.py'], pathex=['/path/to/your/app'], binaries=[], datas=[], hiddenimports=['missing_module'], # ... ) # ... ``` 2.使用PyInstaller的hook机制 PyInstaller提供了一个hook机制,可以让您指定哪些模块应该被打包到可执行文件中。您可以创建一个名为hook-<module_name>.py的文件,并在其中指定要打包的模块。例如,如果您的应用程序依赖于requests模块,您可以创建一个名为hook-requests.py的文件,并在其中添加以下内容: ```python # hook-requests.py from PyInstaller.utils.hooks import collect_all datas, binaries, hiddenimports = collect_all('requests') ``` 3.使用PyInstaller的Analysis类 您可以使用PyInstaller的Analysis类来手动指定要打包的模块。例如: ```python # main.py import requests # ... # main.spec # ... from PyInstaller.building import Analysis a = Analysis(['main.py'], pathex=['/path/to/your/app'], binaries=[], datas=[], hiddenimports=[], hookspath=[], runtime_hooks=[], excludes=[], win_no_prefer_redirects=False, win_private_assemblies=False, cipher=block_cipher, noarchive=False) a.binaries += Analysis(['requests'], pathex=['/path/to/requests'], binaries=[], datas=[], hiddenimports=[], hookspath=[], runtime_hooks=[], excludes=[], win_no_prefer_redirects=False, win_private_assemblies=False, cipher=block_cipher, noarchive=False).binaries # ... ```

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值