用Pyinstaller打包深度学习算法为独立的可执行程序

        前言:随着深度学习算法的流行,在传统工业软件计算领域,传统算法逐渐被深度学习算法给代替,但由于基于python的深度学习算法十分依赖python环境以及例如Pytorch、Scikit-learning、Keras等机器学习库,将深度学习算法运用集成到实际生产中去时,需要随身带着这一大坨库(通常用Anaconda管理)和python解释器,很不方便,因此Pyinstaller是个很实用的工具,能将其打包为独立的可执行程序。

一、Pyinstaller简介

        PyInstaller的历史最早可以追溯到2008年,Hartmut Goebel开发并发布了第一个版本。随着时间的不断发展,Pyinstaller已成为应用最为广泛的python打包工具。其基本原理为(参考https://blog.csdn.net/Dontla/article/details/131474870):

  1. 分析脚本:PyInstaller会分析Python脚本,识别出脚本中所引用的库和资源文件。
  2. 创建打包规范:根据分析结果,PyInstaller会生成一个打包规范文件,即xxx.spec文件,其中包含了脚本的依赖关系、资源文件等信息。
  3. 打包依赖库:PyInstaller会将脚本所依赖的库文件进行打包,这些库文件会被嵌入到可执行文件中。
  4. 生成可执行文件:根据打包规范和打包的依赖库,PyInstaller会生成一个独立的可执行文件,该文件包含了Python解释器、脚本代码和依赖的库文件
  5. 运行可执行文件:生成的可执行文件可以在其他机器上直接运行,无需安装Python解释器和相关库。

        安装Pyinstaller有多种方法:

pip install pyinstaller

二、单独的py文件

        打包单独py文件,使用以下命令即可:

pyinstaller your_script.py

        PyInstaller提供了一些自定义打包选项,可以通过执行pyinstaller --help命令查看,常用的包括以下选项:

可选参数:-h, --help            显示帮助信息并退出-v, --version         显示程序版本信息并退出。--distpath DIR        指定打包应用的目录(默认为./dist)--workpath WORKPATH   指定所有临时工作文件(.log, .pyz等)的目录(默认为./build)-y, --noconfirm       替换输出目录(默认为SPECPATH/dist/SPECNAME)而不需要确认--upx-dir UPX_DIR     UPX工具的路径(默认为搜索执行路径)-a, --ascii           不包含Unicode编码支持(默认情况下如果可用则包含)--clean               在构建之前清理PyInstaller缓存和临时文件。--log-level LEVEL     构建时控制台消息的详细程度。LEVEL可以是TRACE、DEBUG、INFO、WARN、DEPRECATION、ERROR、FATAL之一(默认为INFO)。也可以通过PYI_LOG_LEVEL环境变量进行设置。生成内容:-D, --onedir          创建一个包含可执行文件的单文件夹捆绑包(默认)-F, --onefile         创建一个单文件捆绑的可执行文件。--specpath DIR        存储生成的.spec文件的文件夹(默认为当前目录)-n NAME, --name NAME  分配给捆绑应用和.spec文件的名称(默认为第一个脚本的基本名称)捆绑什么,搜索什么:--add-data <SRC;DEST or SRC:DEST>添加到可执行文件的附加非二进制文件或文件夹。路径分隔符是平台特定的,使用``os.pathsep``(在Windows上为``;``,在大多数Unix系统上为``:``)。此选项可以多次使用。--add-binary <SRC;DEST or SRC:DEST>添加到可执行文件的附加二进制文件。有关详细信息,请参见``--add-data``选项。此选项可以多次使用。-p DIR, --paths DIR   搜索导入的路径(类似于使用PYTHONPATH)。可以使用多个路径,用``':'``分隔,或多次使用此选项。相当于在.spec文件中提供``pathex``参数。--hidden-import MODULENAME, --hiddenimport MODULENAME指定在脚本代码中不可见的导入模块。此选项可以多次使用。--collect-submodules MODULENAME收集指定包或模块的所有子模块。此选项可以多次使用。--collect-data MODULENAME, --collect-datas MODULENAME收集指定包或模块的所有数据文件。此选项可以多次使用。--collect-binaries MODULENAME收集指定包或模块的所有二进制文件。此选项可以多次使用。--collect-all MODULENAME收集指定包或模块的所有子模块、数据文件和二进制文件。此选项可以多次使用。--copy-metadata PACKAGENAME复制指定包的元数据。此选项可以多次使用。--recursive-copy-metadata PACKAGENAME复制指定包及其所有依赖项的元数据。此选项可以多次使用。--additional-hooks-dir HOOKSPATH指定额外的钩子路径。此选项可以多次使用。--runtime-hook RUNTIME_HOOKS指定自定义运行时钩子文件的路径。运行时钩子是与可执行文件捆绑在一起的代码,在任何其他代码或模块之前执行,用于设置运行时环境的特殊功能。此选项可以多次使用。--exclude-module EXCLUDES忽略的可选模块或包(Python名称,而不是路径名称)。此选项可以多次使用。--splash IMAGE_FILE   (实验性功能) 向应用程序添加一个带有图像IMAGE_FILE的启动画面。启动画面可以在解压过程中显示进度更新。如何生成:-d {all,imports,bootloader,noarchive}, --debug {all,imports,bootloader,noarchive}提供用于调试冻结应用程序的帮助。此参数可以多次提供以选择以下选项之一。- all: 以下所有选项。- imports: 指定-v选项给底层Python解释器,导致它在每次初始化模块时打印一条消息,显示加载模块的位置(文件名或内置模块)。参见https://docs.python.org/3/using/cmdline.html#id4。- bootloader: 告诉引导加载程序在初始化和启动捆绑应用程序时发出进度消息。用于诊断缺少导入的问题。- noarchive: 将所有冻结的Python源文件存储为结果可执行文件内的存档,而不是文件存储在结果输出目录中。--python-option PYTHON_OPTION指定要在运行时传递给Python解释器的命令行选项。目前支持"v"(等效于"--debug imports")、"u"和"W<warning control>"。-s, --strip           对可执行文件和共享库应用符号表剥离(不推荐在Windows上使用)--noupx               即使可用,也不使用UPX(在Windows和*nix之间的工作方式不同)--upx-exclude FILE    使用upx时防止对二进制文件进行压缩。如果upx在压缩过程中破坏某些二进制文件,通常会使用此选项。FILE是二进制文件的文件名,不包含路径。此选项可以多次使用。
原文链接:https://blog.csdn.net/Dontla/article/details/131474870

生成的各个目录和文件的作用如下:

  • build/:该目录是pyinstaller生成的临时目录,用于存放编译过程中生成的中间文件和临时文件
  • dist/:该目录是pyinstaller生成的最终目录,用于存放编译后生成的可执行文件或打包后的应用程序
  • XXX.spec:pyinstaller的配置文件,用于指定编译的参数和选项,如果在目标系统中需要重新编译应用程序,可以将该文件一同拷贝过去。

在实际运行可执行程序时,经常会出现找不到XXX的报错,由于pyinstaller没有自动识别到隐藏模块,解决方法一般是在打包过程中用--hidden-import jtop参数来显示地导入该模块

三、打包多文件项目

当对包含多个文件夹的项目进行打包时,需要生成配置文件XXX.spec,并自定义各个配置项,以当前这个测试项目为例,Data目录下为自定义的csv文件,mnist_data下为下载的公开数据集,DNN下为模型定义py,main.py为主程序入口。

执行命令生成xx.spec文件:

pyi-makespec -F main.py

如下所示,可以看到spec文件本身是一个python文件:

# -*- mode: python ; coding: utf-8 -*-block_cipher = None #用于指定加密算法,如果不需要加密可以设置为NoneSETUP_DIR ='C:\\wjy\\Python_project\\deepLearning\\'#分析器,用于指定需要编译的Python脚本文件、路径、二进制文件、数据文件
a = Analysis(['main.py',SETUP_DIR + 'DNN\\DNN.py'],#需要编译的Python脚本文件列表(可以是相对路径)pathex=[], #额外的模块搜索路径,指定pinstaller无法自动检测到的模块binaries=[], #需要包含的二进制文件,包含了动态链接库或共享对象文件,在运行之后会自动更新datas=[("Data","Data"),("mnist_data","mnist_data")], #需要包含的数据文件,每个元素都是一个元组(文件的源路径,在打包文件中的路径)hiddenimports=[], #需要导入的隐藏模块,pyinstaller无法自动检测到的模块hookspath=[], #自定义的查找pyinstaller钩子的路径hooksconfig={}, #自定义的钩子配置,是一个字典runtime_hooks=[], #运行时钩子,本质是一个python脚本,在脚本运行前运行用于准备环境excludes=[], #需要排除的模块win_no_prefer_redirects=False, #在Windows上禁用优先重定向win_private_assemblies=False, #在Windows上使用私有程序集cipher=block_cipher, #加密算法noarchive=False, #是否生成归档文件
)#生成的Python字节码文件,在运行时会被解压缩到临时目录中,然后被加载和执行
pyz = PYZ(a.pure, a.zipped_data, cipher=block_cipher) #纯净的Python字节码文件,压缩的数据,加密算法#生成的可执行文件
exe = EXE(pyz, #Python字节码文件,包含了所有纯python模块a.scripts, #附加的脚本文件a.binaries, #附加的二进制文件a.zipfiles, #附加的压缩文件a.datas, #附加的数据文件[], #所有需要打包到exe文件内的二进制文件name='main', #生成的可执行文件的名称debug=False, #打包过程是否打印调试信息bootloader_ignore_signals=False,strip=False, #是否移除所有的符号信息,使打包出的exe文件更小upx=True, #是否使用UPX压缩exe文件upx_exclude=[], #需要排除的UPX压缩文件runtime_tmpdir=None,console=True, #是否为控制台应用程序,true则在控制台窗口运行,否则作为后台进程运行disable_windowed_traceback=False, #是否禁用窗口化的回溯argv_emulation=False, #是否启用命令行参数模拟target_arch=None, #目标系统的架构,确保打包的应用程序在目标系统上能够正常运行codesign_identity=None, #代码签名标识entitlements_file=None, #授权文件
)

其中datas=[("Data","Data")]意思是将main.py当前目录下的Data目录(及其目录中的文件)加入目标exe中,在运行时放在临时文件的根目录下,名称为Data。

然后使用pyinstaller命令即可根据配置文件生成可执行程序:

pyinstaller XXX.spec

四、常见问题

1、打包输出后的exe文件执行时,报错“找不到xxx 文件”

一般两种解决方案,在spec文件中的" hiddenimports=[]"添加漏掉的包;如果该方法不起效,则直接把对应的文件复制到dist目录下即可,例如在该实例中,运行时报错“找不到pytorch_lightning/ version.info”,则直接在anaconda环境中将该文件复制过去即可。

2、exe运行时函数或python语句报错

一般是python包版本错误例如cpu环境中安装cuda版本的Pytorch,或者是与目标运行系统不兼容

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.mzph.cn/news/225709.shtml

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

西南科技大学数字电子技术实验五(用计数器设计简单秒表)预习报告

一、计算/设计过程 说明&#xff1a;本实验是验证性实验&#xff0c;计算预测验证结果。是设计性实验一定要从系统指标计算出元件参数过程&#xff0c;越详细越好。用公式输入法完成相关公式内容&#xff0c;不得贴手写图片。&#xff08;注意&#xff1a;从抽象公式直接得出结…

UE5 PlaceActor

⚠️ 重点 PlaceActors 需在引擎初始化之后 但&#xff0c;单为这一个功能&#xff0c;更改整个模块的启动顺序&#xff0c;也不太划算 更好的办法是&#xff0c;启动顺序保持正常&#xff08;如"LoadingPhase": "Default" &#xff09;&#xff0c;然后…

Java EE 多线程之线程安全的集合类

文章目录 1. 多线程环境使用 ArrayList1. 1 Collections.synchronizedList(new ArrayList)1.2 CopyOnWriteArrayList 2. 多线程环境使用队列2.1 ArrayBlockingQueue2.2 LinkedBlockingQueue2.3 PriorityBlockingQueue2.4 TransferQueue 3. 多线程环境使用哈希表3.1 Hashtable3.…

innerHTML、innerText、textContent有什么区别

innerHTML、innerText、textContent有什么区别 在 HTML 中&#xff0c;innerHTML、innerText、 和textContent是 DOM&#xff08;文档对象模型&#xff09;的属性。它们允许我们读取和更新 HTML 元素的内容。 但它们在包含的内容以及处理 HTML 标签的方式有不同的行为。 读完…

分布式事务seata使用示例及注意事项

分布式事务seata使用示例及注意事项 示例说明代码调用方&#xff08;微服务A&#xff09;服务方&#xff08;微服务B&#xff09; 测试测试一 &#xff0c;seata发挥作用&#xff0c;成功回滚&#xff01;测试二&#xff1a;处理feignclient接口的返回类型从Integer变成String,…

【Spring Boot】快速入门

一、引言 1、什么是spring boot&#xff1f; Spring Boot是由Pivotal团队提供的全新框架&#xff0c;其设计目的是用来简化新Spring应用的初始搭建以及开发过程。该框架使用了特定的方式来进行配置&#xff0c;从而使开发人员不再需要定义样板化的配置。通过这种方式&#xff…

【RocketMQ-Install】Windows 环境下安装 RocketMQ 及基础命令的使用

【RocketMQ-Install】Windows 环境下 安装本地 RocketMQ 及基础命令的使用 1&#xff09;下载 RocketMQ 安装包1.1.官网下载&#xff08;推荐&#xff09;1.2.Git 下载1.3.安装环境要求说明 2&#xff09;Windows 安装3&#xff09;基础命令测试 1&#xff09;下载 RocketMQ 安…

多分类预测 | MATLAB实现CNN-LSTM-Attention多输入分类预测

分类预测 | MATLAB实现CNN-LSTM-Attention多输入分类预测 分类效果 需要源码和数据的私信&#xff08;微微有偿取哦&#xff09;

通义千问 Qwen-72B-Chat在PAI-DSW的微调推理实践

01 引言 通义千问-72B&#xff08;Qwen-72B&#xff09;是阿里云研发的通义千问大模型系列的720亿参数规模模型。Qwen-72B的预训练数据类型多样、覆盖广泛&#xff0c;包括大量网络文本、专业书籍、代码等。Qwen-72B-Chat是在Qwen-72B的基础上&#xff0c;使用对齐机制打造的…

主宰无双H5:WIN学习手工服务端通用视频教程及GM授权物品后台,支持三网H5玩法介绍

标题&#xff1a;主宰无双H5&#xff08;游戏源码&#xff09;&#xff1a;WIN学习手工服务端通用视频教程及GM授权物品后台&#xff0c;支持三网H5玩法的百科 一、引言 随着互联网的快速发展&#xff0c;H5游戏逐渐成为人们休闲娱乐的重要方式。主宰无双H5游戏源码作为一款深…

Android解决报错 superclass access check failed: class

Android解决报错 superclass access check failed: class 前言&#xff1a; 最近在打开之前的项目demo时&#xff0c;出现一个错误Cause: superclass access check failed: class butterknife.compiler.ButterKnifeProcessor$RScanner 1.错误信息如下&#xff1a; Executio…

《Linux C编程实战》笔记:目录操作

目录的创建和删除 mkdir函数 #include <sys/stat.h> #include <sys/types.h> int mkdir(const char *pathname, mode_t mode); mkdir创建一个新的空目录。空目录中会自动创建.和..目录项。所创建的目录的存取许可权由mode (mode &~umask)指定。 新创建目录的…

[Linux] LVS负载均衡群集+NAT部署

一、LVS负载均衡群集知识 1.1 群集的的定义及意义 Cluster&#xff0c;集群&#xff08;也称群集&#xff09;由多台主机构成&#xff0c;但对外只表现为一一个整体&#xff0c;只提供一-个访问入口(域名或IP地址)&#xff0c; 相当于一台大型计算机。 群集的作用&#xff1…

vue3使用Mars3D写区块地图

效果图 引入相关文件 因为我也是第一次使用&#xff0c;所以我是把插件和源文件都引入了&#xff0c;能使用启动 源文件 下载地址&#xff1a; http://mars3d.cn/download.html 放入位置 在index.html中引入 <!--引入cesium基础lib--><link href"/static/C…

Kubernetes 容器编排 -- 1

前言 知识扩展 早在 2015 年 5 月&#xff0c;Kubernetes 在 Google 上的搜索热度就已经超过了 Mesos 和 Docker Swarm&#xff0c;从那儿之后更是一路飙升&#xff0c;将对手甩开了十几条街,容器编排引擎领域的三足鼎立时代结束。 目前&#xff0c;AWS、Azure、Google、阿里…

软考科目如何选择?

软考科目繁多&#xff0c;让许多学弟学妹感到困惑&#xff0c;不知道该选择哪个科目。以下是一些建议&#xff0c;可以根据个人实际需求选择备考的科目。 1、初级是可选的 软考初级非常简单&#xff0c;适合刚刚入门学习的朋友报考。对于一些有基础的朋友&#xff0c;建议直接…

【从零开始学习--设计模式--装饰者模式】

返回首页 前言 感谢各位同学的关注与支持&#xff0c;我会一直更新此专题&#xff0c;竭尽所能整理出更为详细的内容分享给大家&#xff0c;但碍于时间及精力有限&#xff0c;代码分享较少&#xff0c;后续会把所有代码示例整理到github&#xff0c;敬请期待。 此章节介绍装…

java实现局域网内视频投屏播放(二)爬虫

代码链接 视频播放原理 大多视频网站使用的是m3u8&#xff0c;m3u8其实不是一个真正的视频文件&#xff0c;而是一个视频播放列表&#xff08;playlist&#xff09;。它是一种文本文件&#xff0c;里面记录了一系列的视频片段&#xff08;segment&#xff09;的网络地址。这些…

原来定时发朋友圈设置这么简单?看完我也会了

目前微信作为最大的社交平台之一&#xff0c;吸引了众多使用者。你是否听过有些朋友感叹这么多微信号&#xff0c;需要每天手动发布朋友圈&#xff0c;任务很繁琐呢&#xff1f;是否希望可以事先设置好定时发送的功能&#xff0c;让朋友圈自动更新&#xff0c;省去手动发送的麻…

初探栈溢出(下)

0x04 漏洞利用 作为脚本小子&#xff0c;先跑一下写好了的exploit脚本。 打开HackSysEVDExploit.sln文件&#xff0c;直接在vs2019上编译即可。 将生成的HackSysEVDExploit.exe拷贝至win7&#xff0c;执行如下命令 直接可以获取system权限。 那么只跑一下脚本肯定不行&#…