当前位置: 首页 > news >正文

用pyinstaller打包LGBM模型为ELF/EXE可执行文件

1. 引入

写好的python代码和模型,如果需要做到离线部署、运行,就必须要将代码和模型打包为可独立运行的可执行文件。
使用pyinstaller就能做到这个,相同的代码,在windows上运行就能打包为exe,在linux上运行就能打包为elf。

打包的过程是怎么样?有哪些不同的打包方式?各有什么优缺点呢?

2. 打包过程:生成多个文件

假设我们的项目有3个文件组成:

  • main.py : 主入口程序
  • utils.py: 各种工具函数
  • model_rf.jl: 模型文件

打包过程分为如下步骤,在windows和linux都一样:

  1. 安装pyinstaller
pip install pyinstaller
  1. 生成.spec文件
pyi-makespec -w main.py
  1. 修改.spec文件

注意几点:
(1)主入口程序写在: Analysis第一个参数
(2)其他依赖程序写在:Analysis第一个参数的列表中
(3)模型文件写在: binaries中,注意要写为tuple

修改后好的.spec文件如下所示:

# -*- mode: python ; coding: utf-8 -*-block_cipher = Nonea = Analysis(['main.py','utils.py'],pathex=[],binaries=[('model_rf.jl','.')],datas=[],hiddenimports=['scipy.special.cython_special'],hookspath=[],hooksconfig={},runtime_hooks=[],excludes=[],win_no_prefer_redirects=False,win_private_assemblies=False,cipher=block_cipher,noarchive=False,
)
pyz = PYZ(a.pure, a.zipped_data, cipher=block_cipher)exe = EXE(pyz,a.scripts,[],exclude_binaries=True,name='main',debug=False,bootloader_ignore_signals=False,strip=False,upx=True,console=False,disable_windowed_traceback=False,argv_emulation=False,target_arch=None,codesign_identity=None,entitlements_file=None,
)
coll = COLLECT(exe,a.binaries,a.zipfiles,a.datas,strip=False,upx=True,upx_exclude=[],name='main',
)

至于为什么要加入hiddenimports=['scipy.special.cython_special'],,是因为笔者在python3.8下运行,打包正常后,运行可执行文件依然报错如下:

(xxx) [aaa@bbb main]$ ./main
Traceback (most recent call last):File "main.py", line 1, in <module>File "PyInstaller/loader/pyimod02_importers.py", line 385, in exec_moduleFile "sklearn/ensemble/__init__.py", line 5, in <module>File "PyInstaller/loader/pyimod02_importers.py", line 385, in exec_moduleFile "sklearn/ensemble/_base.py", line 18, in <module>File "PyInstaller/loader/pyimod02_importers.py", line 385, in exec_moduleFile "sklearn/tree/__init__.py", line 6, in <module>File "PyInstaller/loader/pyimod02_importers.py", line 385, in exec_moduleFile "sklearn/tree/_classes.py", line 41, in <module>File "sklearn/tree/_criterion.pyx", line 1, in init sklearn.tree._criterion
ModuleNotFoundError: No module named 'scipy.special.cython_special'
[45300] Failed to execute script 'main' due to unhandled exception!

根据参考4,加入后就能修正该错误,因为pyinstaller没有加入这个必须的依赖。

  1. 运行命令进行打包
pyinstaller main.spec

这种打包方式,会生成一个可执行文件(位于dist文件夹中),也会生成很多个运行该可执行文件所需的依赖库(dll, so),所以部署时,需要将整个文件夹拷贝到目标机。

那么,能不能只生成一个可执行文件,不生成额外的依赖文件呢?

3. 打包过程:生成单个文件

如果只有一个py文件,那么,使用一条命令就能实现生成独立的可执行文件:

pyinstaller -F main.py

但是我们这个例子中,是有多个文件的,这就必须用下面的命令来打包:

pyinstaller -F  -w main.py -p utils.py -p model_rf.jl --hidden-import scipy.special.cython_special

这样就能在dist文件夹中生成一个较大的可执行文件,部署时只需要部署这一个文件就可以。

4. 两种打包方式的区别

上面讲解了生成多个文件生成单个文件两种pyinstaller的打包方式。看上去生成单个文件方式更方便。

但是,实际运行打包后的可执行文件,就能发现:
(1)生成单个文件,最终只生成一个可执行文件,比较简单,但是运行很慢
(2)生成多个文件,最终生成一堆文件,但是其中的可执行文件运行会快很多;笔者实测这种方式比单个文件快5倍

为什么生成单个文件会更慢呢?从参考3可知

“one file” mode – this mode means that it has to unpack all of the libraries to a temporary directory before the app can start

因为这个很大的单个文件,在运行主函数前,会将所有依赖都释放到临时文件中,再加载运行。这个释放文件的操作,需要占用I/O,而且每次启动程序都释放文件,自然就拖慢了运行速度。

5. 总结

pyinstaller能实现将多个.py文件,和其他模型文件,打包为可离线运行,不安装配置环境就能运行的可执行文件EXE或者ELF。
打包时,建议按照生成多个文件的方式来打包,这样程序运行起来会更快。 本文用到的所有代码和相关文件,都放到这个repo了,在linux下是正确运行的:https://github.com/ybdesire/machinelearning/tree/master/pyinstaller_model_package。

参考

  1. https://blog.csdn.net/weixin_42112050/article/details/129555170
  2. https://blog.csdn.net/LIUWENCAIJIAYOU/article/details/121470028
  3. 为什么打包后的程序运行慢: https://stackoverflow.com/questions/9469932/app-created-with-pyinstaller-has-a-slow-startup
  4. https://stackoverflow.com/questions/62581504/why-do-i-have-modulenotfounderror-no-module-named-scipy-special-cython-specia
  5. 本文所用代码。https://github.com/ybdesire/machinelearning/tree/master/pyinstaller_model_package

相关文章:

用pyinstaller打包LGBM模型为ELF/EXE可执行文件

1. 引入 写好的python代码和模型&#xff0c;如果需要做到离线部署、运行&#xff0c;就必须要将代码和模型打包为可独立运行的可执行文件。 使用pyinstaller就能做到这个&#xff0c;相同的代码&#xff0c;在windows上运行就能打包为exe&#xff0c;在linux上运行就能打包为…...

软考中级—— 操作系统知识

进程管理 操作系统概述 操作系统的作用&#xff1a;通过资源管理提高计算机系统的效率&#xff1b;改善人机界面向用户提供友好的工作环境。 操作系统的特征&#xff1a;并发性、共享性、虚拟性、不确定性。 操作系统的功能&#xff1a;进程管理、存储管理、文件管理、设备…...

我们是否真的需要k8s?

文章目录 背景k8s相关的讨论为什么要用k8sk8s带来了什么当前业务使用到k8s的核心优势了吗直接自己买服务器会不会更便宜&#xff1f;其他QA没有人可以说出来为什么一定要用k8s而不是其他的没有人可以解释为什么成本核算困难以及成本这么高的原因没有人给出面向C端&#xff0c;面…...

基于蜉蝣优化的BP神经网络(分类应用) - 附代码

基于蜉蝣优化的BP神经网络&#xff08;分类应用&#xff09; - 附代码 文章目录 基于蜉蝣优化的BP神经网络&#xff08;分类应用&#xff09; - 附代码1.鸢尾花iris数据介绍2.数据集整理3.蜉蝣优化BP神经网络3.1 BP神经网络参数设置3.2 蜉蝣算法应用 4.测试结果&#xff1a;5.M…...

前端系列-1 HTML+JS+CSS基础

背景&#xff1a; 前端系列会收集碎片化的前端知识点&#xff0c;作为自己工作和学习时的字典&#xff0c;欢迎读者收藏和使用。 笔者是后端开发&#x1f636;前端涉猎不深&#xff0c;因此文章重在广度和实用&#xff0c;对原理和性能不会过多深究。 1.html 1.1 html5网页结…...

Learning Invariant Representation for Unsupervised Image Restoration

Learning Invariant Representation for Unsupervised Image Restoration (Paper reading) Wenchao Du, Sichuan University, CVPR20, Cited:63, Code, Paper 1. 前言 近年来&#xff0c;跨域传输被应用于无监督图像恢复任务中。但是&#xff0c;直接应用已有的框架&#xf…...

1.4.C++项目:仿muduo库实现并发服务器之buffer模块的设计

项目完整版在&#xff1a; 一、buffer模块&#xff1a; 缓冲区模块 Buffer模块是一个缓冲区模块&#xff0c;用于实现通信中用户态的接收缓冲区和发送缓冲区功能。 二、提供的功能 存储数据&#xff0c;取出数据 三、实现思想 1.实现换出去得有一块内存空间&#xff0c;采…...

AndroidStudio精品插件集

官网 项目地址&#xff1a;Github博客地址&#xff1a;Studio 精品插件推荐 使用需知 所有插件在 Android Studio 2022.3.1.18&#xff08;长颈鹿&#xff09;上测试均没有问题&#xff0c;推荐使用此版本Android Studio 2022.3.1.18&#xff08;长颈鹿&#xff09;正式版下…...

java图书管理系统

一、 引言 图书管理系统是一个用于图书馆或书店管理图书信息、借阅记录和读者信息的应用程序。本系统使用Java Swing框架进行开发&#xff0c;提供直观的用户界面&#xff0c;方便图书馆管理员或书店工作人员对图书信息进行管理。以下是系统的设计、功能和实现的详细报告。 二…...

大屏自适应容器组件-Vue3+TS

1.引言 在做数字大屏时&#xff0c;图表能跟着浏览器的尺寸自动变化&#xff0c;本文采用Vue3前端框架&#xff0c;采用TypeScript语言&#xff0c;封装了一个大屏自适应组件&#xff0c;将需要显示的图表放入组件的插槽中&#xff0c;就能实现自适应屏幕大小的效果。 2.实际…...

java图书信息管理

一、项目概述 本图书信息管理系统旨在提供一个直观的用户界面&#xff0c;用于管理图书馆或书店的图书信息。系统包括图书添加、查询、借阅和归还等功能。 二、系统架构 系统采用JavaSwing作为前端UI框架&#xff0c;后端使用Java Servlet处理业务逻辑&#xff0c;数据存储在…...

apache服务器出现No input file specified.解决方案

APACHE服务器出现No input file specified.解决方案 thinkcmf程序默认的.htaccess里面的规则&#xff1a; <IfModule mod_rewrite.c> RewriteEngine on RewriteCond %{REQUEST_FILENAME} !-d RewriteCond %{REQUEST_FILENAME} !-f RewriteRule ^(.*)$ index.php/$1 [QSA…...

你写过的最蠢的代码是?——全栈开发篇

&#x1f337;&#x1f341; 博主猫头虎 带您 Go to New World.✨&#x1f341; &#x1f984; 博客首页——猫头虎的博客&#x1f390; &#x1f433;《面试题大全专栏》 文章图文并茂&#x1f995;生动形象&#x1f996;简单易学&#xff01;欢迎大家来踩踩~&#x1f33a; &a…...

正点原子嵌入式linux驱动开发——TF-A初探

上一篇笔记中&#xff0c;正点原子的文档简单讲解了一下什么是TF-A&#xff0c;并且也学习了如何编译TF-A。但是TF-A是如何运行的&#xff0c;它的一个运行流程并未涉及。TF-A的详细运行过程是很复杂的&#xff0c;涉及到很多ARM处理器底层知识&#xff0c;所以这一篇笔记的内容…...

【网安别学成开发】之——python篇

经典入门编程题 1.猜数字 经典的猜数字游戏&#xff0c;几乎所有人学编程时都会做。 功能描述&#xff1a; 随机选择一个三位以内的数字作为答案。用户输入一个数字&#xff0c;程序会提示大了或是小了&#xff0c;直到用户猜中。 #!/usr/bin/env python3import randomresu…...

vue图片显示

一、Vue图片显示方法&#xff1a; 1.直接使用<img>标签&#xff1a; 最简单的方法是使用<img>标签&#xff0c;并将图片的URL作为src属性的值。例如&#xff1a; <img src"path/to/your/image.jpg" alt"Image"> 如果是绝对路径&#x…...

S32K144 GPIO编程

前面的文章介绍了如何在MDK-Keil下面进行S32K144的开发&#xff0c;下面就使用该工程模板进行GPIO LED的编程试验。 1. 开发环境 S32K144EVB-Q100开发板MDK-Keil Jlink 2. 硬件连接 S32K144EVB-Q100开发板关于LED的原理图如下&#xff1a; 也就是具体连接关系如下&#xf…...

域名备案流程(个人备案,腾讯云 / 阿里云)

文章目录 1.网站备案的目的2.备案准备的材料2.1 网站域名2.2 云资源或备案授权码2.3 电子材料 3.首次个人备案准备的材料3.1 主体相关3.2 域名相关3.3 网站相关3.4 网站服务相关3.5 变更相关 4.个人备案流程4.1 登录系统4.2 填写备案信息&#x1f340; 填写备案省份&#x1f34…...

子网ip和子网掩码的关系

子网ip和子网掩码的关系 一个IP地址被分为两部分&#xff1a;网络地址和主机地址。这是通过子网掩码来实现的。 子网掩码&#xff08;Subnet Mask&#xff09;是一个32位的二进制数&#xff0c;它用来区分一个IP地址中的网络地址和主机地址。在子网掩码中&#xff0c;网络地址…...

openGauss学习笔记-88 openGauss 数据库管理-内存优化表MOT管理-内存表特性-使用MOT-MOT使用将磁盘表转换为MOT

文章目录 openGauss学习笔记-88 openGauss 数据库管理-内存优化表MOT管理-内存表特性-使用MOT-MOT使用将磁盘表转换为MOT88.1 前置条件检查88.2 转换88.3 转换示例 openGauss学习笔记-88 openGauss 数据库管理-内存优化表MOT管理-内存表特性-使用MOT-MOT使用将磁盘表转换为MOT …...

网络-Ajax

文章目录 前言一、Ajax优点&#xff1a;缺点&#xff1a; 二、使用步骤XNLHttpRequest对象完整代码 总结 前言 本文主要记录Ajax技术的简介&#xff0c;以及用法。 一、Ajax Ajax是一组用于在Web浏览器和Web服务器之间进行异步通信的Web开发技术。 它代表着Asynchronous Java…...

Autowired和Resource的关系

相同点对于下面的代码来说&#xff0c;如果是Spring容器的话&#xff0c;两个注解的功能基本是等价的&#xff0c;他们都可以将bean注入到对应的field中 不同点但是请注意&#xff0c;这里说的是基本相同&#xff0c;说明还是有一些不同点的&#xff1a; byName和byType匹配顺…...

HashTable, HashMap, ConcurrentHashMap 之间的区别

HashMap: 线程不安全. key 允许为 null。 Hashtable: 线程安全. 使用 synchronized 锁 Hashtable 对象, 效率较低. key 不允许为 null.。只是简单的把关键方法上加上了 synchronized 关键字。如 get 和 set &#xff0c;这相当于直接针对 Hashtable 对象本身加锁&#xff0c;如…...

Maven下载源码出现:Cannot download sources Sources not found for org.springframwork...

Maven下载源码出现&#xff1a;Cannot download sources Sources not found for org.springframwork… 最近重装了IDEA再次查看源码时发现总是报错&#xff0c;网上找了很多&#xff0c;发现解决方法都是在项目终端执行如下命令&#xff1a; mvn dependency:resolve -Dclassi…...

C进阶--字符函数和字符串函数介绍

✨ 更多细节参考 cplusplus.com/reference/cstring/ 使用方式&#xff1a; ⭕ 求字符串长度 &#x1f58c; strlen 函数原型&#xff1a; size_t strlen ( const char * str ); 作用&#xff1a; 获取字符串长度 ✨补充&#xff1a; ⭐字符串以 \0 作为结束标志&…...

算法通关村第五关-二叉树遍历(层数优先)之经典问题:简单的层序遍历、层序遍历分层、自底向上的层序遍历

基础知识&#xff08;青铜挑战&#xff09; 了解二叉树的基础知识 实战训练&#xff08;白银挑战&#xff09; 简单的层序遍历 基本的层序遍历思路很清晰&#xff1a; 给你一个二叉树根节点&#xff0c;你需要创建一个队列 queue 来遍历节点&#xff0c;一个链表 list 来存储…...

C++左右值及引用

1 左值和右值 简单记法&#xff1a;能取地址的是左值&#xff0c;不能取地址的是右值 右值一般是常量 例&#xff1a; i 是右值&#xff0c;因为先把 i 赋值给临时变量&#xff0c;临时变量在1&#xff0c;而临时变量是将亡值&#xff0c;&i取地址会报错 i是左值&#xf…...

如何备份和恢复数据库

目录 1.xtrabackup 是什么2.全量备份3.增量备份4.使用备份进行恢复5.原理6.参考 本文主要介绍如何使用xtrabackup 进行数据库的备份和恢复&#xff0c;并在最后介绍了原理。 1.xtrabackup 是什么 XtraBackup是由Percona开发的一款开源的MySQL数据库备份工具。它可以对InnoDB和…...

简化数据库操作:探索 Gorm 的约定优于配置原则

文章目录 使用 ID 作为主键数据库表名TableName临时指定表名列名时间戳自动填充CreatedAtUpdatedAt时间戳类型Gorm 采用约定优于配置的原则,提供了一些默认的命名规则和行为,简化开发者的操作。 使用 ID 作为主键 默认情况下,GORM 会使用 ID 作为表的主键: type User st…...

保姆级Anaconda安装教程

一.anaconda下载 建议使用清华大学开源软件镜像站进行下载&#xff0c;使用官网下载速度比较慢。 anaconda清华大学开源软件镜像站 &#xff1a; https://mirrors.tuna.tsinghua.edu.cn/anaconda/archive/ 一路next即可&#xff0c;注意添加环境变量得选项都勾上。 二.验证…...

asp.net mysql 网站开发/百度关键词收录

1. 问题描述&#xff1a; 给定一个 nm 大小的二进制矩阵&#xff0c;矩阵中只包含 0 和 1。现在&#xff0c;你可以进行如下操作&#xff1a;选中一个 22 的子矩阵&#xff0c;改变其中 3 个元素的值&#xff08;0 变为 1&#xff0c;1 变为 0&#xff09;。你的任务是通过上述…...

三层架构做网站还是系统/百度seo优化软件

​使用Docker安装Tensorflow 对程序员来说在配置环境上花费大量时间&#xff0c;着实没有太大意义。遇到这篇文章以前您可能一个tensorflow环境配半天&#xff0c;各种错误出现&#xff0c;其他环境也一样。但是Docker为我们提供了解决方案&#xff0c;而且相比虚拟机来说&…...

java做网站需要的技术/百度网首页登录入口

昨天花了一个下午才升级成功&#xff0c;今天费了点儿周折才打上补丁&#xff0c;不想同道中人再浪费不必要的时间&#xff0c;把以把我的步骤给大家说一下&#xff0c;供参考。 使用工具:x65Flasher与VK 升级文件及工具下载:http://yizhe.net/c65/ 步骤&#xff1a; 1.关机&am…...

网站建站的标准/重庆seo网页优化

1、Base64编码介绍Base64不能称为加解密算法&#xff0c;Base64编码可以把二进制数据转换为可打印的ASCII字符&#xff0c;常用于email消息中的二进制数据编码和HTTP协议中的basic认证。Base64编码之后的ASCII字符串包括64个可打印字符&#xff0c;如下&#xff1a;26个大写字母…...

专业的培训网站建设/整合营销经典案例

文章目录yield 以及生成器和迭代器列表推导式装饰器巧用断言assertPython 是一种代表简单思想的语言&#xff0c;其语法相对简单&#xff0c;很容易上手。不过&#xff0c;如果就此小视 Python 语法的精妙和深邃&#xff0c;那就大错特错了。本文精心筛选了最能展现 Python 语法…...

wordpress导入ssl证书/深圳知名seo公司

1、jvm Java 虚拟机&#xff08;JVM&#xff09;是运行 Java 字节码的虚拟机。JVM 有针对不同系统的特定实现&#xff08;Windows&#xff0c;Linux&#xff0c;macOS&#xff09;&#xff0c;目的是使用相同的字节码&#xff0c;它们都会给出相同的结果。 什么是字节码?采用…...