用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 #用于指定加密算法,如果不需要加密可以设置为None

SETUP_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.mfbz.cn/a/249419.html

如若内容造成侵权/违法违规/事实不符,请联系我们进行投诉反馈qq邮箱809451989@qq.com,一经查实,立即删除!

相关文章

HarmonyOS4.0从零开始的开发教程17给您的应用添加通知

HarmonyOS&#xff08;十五&#xff09;给您的应用添加通知 通知介绍 通知旨在让用户以合适的方式及时获得有用的新消息&#xff0c;帮助用户高效地处理任务。应用可以通过通知接口发送通知消息&#xff0c;用户可以通过通知栏查看通知内容&#xff0c;也可以点击通知来打开应…

linux 查看服务启动时间

文章目录 linux 查看服务启动时间参数解析 linux 查看服务启动时间 [root104 ~]# ps -o lstart -p ps -ef |grep -v grep |grep "zookeeper"|awk {print$2}STARTED Fri Dec 15 16:54:10 2023参数解析 linux 命令中 ps -ef 详解 ps -ef表示查看全格式的进程。 ps …

UE5 PlaceActor

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

超燃超欢乐!修仙喜剧动画《师兄啊师兄》第二季稳健开播

12月14日&#xff0c;备受瞩目的《师兄啊师兄》第二季终于稳健开播&#xff01;首播两集连放&#xff0c;同时第一季全13集限免&#xff0c;不仅便于新观众丝滑入坑&#xff0c;老观众也可以二刷重温&#xff0c;可以说是非常良心了&#xff01; 《师兄啊师兄》改编自人气网络小…

LeetCode(63)旋转链表【链表】【中等】

目录 1.题目2.答案3.提交结果截图 链接&#xff1a; 旋转链表 1.题目 给你一个链表的头节点 head &#xff0c;旋转链表&#xff0c;将链表每个节点向右移动 k 个位置。 示例 1&#xff1a; 输入&#xff1a;head [1,2,3,4,5], k 2 输出&#xff1a;[4,5,1,2,3]示例 2&…

PE硅芯管抗紫外线和微生物侵害,对水质不会造成任何影响

PE硅芯管是一种优质的管道材料&#xff0c;具有出色的抗紫外线和微生物侵害的能力。这种管道材料采用特殊的生产工艺&#xff0c;添加了硅质材料&#xff0c;从而增强了管道的耐久性。 由于其抗紫外线性能强&#xff0c;PE硅芯管即使在户外长时间暴露于阳光下也不会出现老化、…

基于ssm培训学校教学管理平台论文

摘 要 社会的进步&#xff0c;教育行业发展迅速&#xff0c;人们对教育越来越重视&#xff0c;在当今网络普及的情况下&#xff0c;教学管理模式也开始逐渐网络化&#xff0c;学校开始网络教学管理模式。 本文研究的培训学校教学管理平台基于SSM框架&#xff0c;采用Java技术和…

关于主持知识竞赛的几点体会

知识竞赛被许多人认为不太好主持&#xff0c;因为既然是竞赛&#xff0c;总会有输有赢&#xff0c;而参赛各队又多是有备而来&#xff0c;场上一派剑拔弩张的气势。囿于这样的气氛中&#xff0c;再加上知识竞赛的固定模式&#xff0c;主持人很难有所发挥&#xff0c;因此&#…

6个超好用的小众图片素材网站,高清、免费,值得收藏~

推荐几个超好用的图片素材网站&#xff0c;免费下载&#xff0c;还可以商用&#xff0c;建议收藏哦~ 1、菜鸟图库 https://www.sucai999.com/pic.html?vNTYwNDUx 我推荐过很多次的设计素材网站&#xff0c;除了设计类素材&#xff0c;还有很多自媒体可以用到的高清图片、背景…

win11装了Ubuntu系统,切换到 wim11,蓝牙耳机显示已连接,但耳机无声音,且声音外放正常

打开 设置>蓝牙和其它设备 &#xff0c;发现耳机是连接正常的&#xff0c;点击页面的 设备 发现蓝牙耳机已经被识别音频&#xff0c;也可能没有被识别为音频设备&#xff0c;而是显示其他设备&#xff0c;这样会导致输出设备上没有耳机这一选项&#xff0c;则点击设备和打印…

当你在浏览器中键入“https://www.google.com”并按 Enter 键时会发生什么?

互联网是我们每天使用的奇迹&#xff0c;在其表面之下隐藏着一层层的复杂性。有没有想过当你输入一个URL时&#xff0c;幕后会发生什么&#xff1f;今天&#xff0c;让我们满足我们的好奇心&#xff0c;揭开由一个简单的命令启动的错综复杂的进程网络&#xff1a;键入“https:/…

世微 锂电池保护IC DW01 充电器检测过充保护SOT23-6

一、 描述 DW01A 是一个锂电池保护电路&#xff0c;为避免锂电池因过充电、过放电、电流过大导致电池寿命缩短或电池被损坏而设计的。它具有高精确度的电压检测与时间延迟电路。 二、 主要特点 工作电流低 过充检测 4.3V&#xff0c;过充释放 4.05V&#xff1b; 过放检测 2.4…

5.1 C++11强类型枚举

一、C枚举的缺陷 1.类型冲突 枚举值和类型都是全局可见的&#xff0c; 与正常C的namespace、类等都是格格不入的&#xff0c;并且还容易导致冲突。 enum Type { General, Light, Medium, Heavy }; enum Category { General, Pistol, MachineGun, Cannon }; 如果在相同作用域…

0x21 树与图的遍历

0x21 树与图的遍历 树与图最常见的储存方式就是使用一个邻接表保存它们的边集。邻接表以head数组为表头&#xff0c;使用ver和edge数组分别存储边的终点和权值&#xff0c;使用next数组模拟链表指针&#xff08;就像我们在0x13节中讲解邻接表所给出的代码那样&#xff09;。 …

计算机网络:应用层(二) Web与http协议

我最近开了几个专栏&#xff0c;诚信互三&#xff01; > |||《算法专栏》&#xff1a;&#xff1a;刷题教程来自网站《代码随想录》。||| > |||《C专栏》&#xff1a;&#xff1a;记录我学习C的经历&#xff0c;看完你一定会有收获。||| > |||《Linux专栏》&#xff1…

编辑器Sublime text 常用快捷命令 列模式 替换空行

平替notepad 下载可取官网 www.sublimetext.com 据说可以无限试用&#xff0c;没有功能限制 1、快速删除空行 ctrl h选择正则表达式 .*Find输入&#xff1a; ^(\t)*$\nReplace输入&#xff1a;点击Replace All 2、快速选择指定字符 用鼠标选中alt f3修改 3、列编辑模式 ct…

基于ssm框架仓库系统论文

摘 要 使用旧方法对仓库信息进行系统化管理已经不再让人们信赖了&#xff0c;把现在的网络信息技术运用在仓库信息的管理上面可以解决许多信息管理上面的难题&#xff0c;比如处理数据时间很长&#xff0c;数据存在错误不能及时纠正等问题。 这次开发的仓库管理系统有管理员和…

240Wqps,美团用户中台, 如何使用DDD架构?

尼恩说在前面 在40岁老架构师 尼恩的读者交流群(50)中&#xff0c;最近有小伙伴拿到了一线互联网企业如阿里、滴滴、极兔、有赞、希音、百度、网易、美团的面试资格&#xff0c;遇到很多很重要的面试题&#xff1a; 谈谈你的DDD落地经验&#xff1f; 谈谈你对DDD的理解&#x…

DCMM数据管理能力成熟度需要具备什么条件?

DCMM&#xff0c;全称为数据管理能力成熟度评估模型&#xff0c;是一个组织数据管理和应用能力的评估框架。该模型可以帮助组织清晰地定义其数据当前所处的发展阶段以及未来发展方向。具体来说&#xff0c;DCMM将数据管理能力划分为8个核心能力域&#xff1a;数据战略、数据管理…

FPGA竞赛_考试赢积分免费兑换FPGA项目课(每周更新积分排名情况)

明德扬特别组织了考试竞赛赢积分兑换FPGA项目课活动&#xff0c;欢迎大家积极参加考试&#xff01; 我是本次活动的负责人小易老师&#xff0c;有任何问题可以联系我&#xff1a;13112063618&#xff08;微信同步&#xff09; 一.考试兑换FPGA项目课 可以兑换FPGA项目课&#…
最新文章