首页 > 其他分享 >PyInstaller打包模型文件

PyInstaller打包模型文件

时间:2024-09-21 13:27:23浏览次数:8  
标签:文件 PyInstaller package python 模型 -- test 打包

  最近需要将python项目打包成可执行文件,研究了下,记录下整个过程。项目是基于mxnet实现的一个物体检测器,需要打包成exe文件(windows)和linux的可执行文件,选择PyInstaller作为打包工具。主要有三个问题需要注意:

  1.由于PyInstaller会将python环境中的所有安装包都打包进去,所以最好新建一个虚拟环境,只安装项目中需要的安装包

  2. 模型和配置文件等静态资源,添加时注意其打包路径,以及代码运行时如何寻找这些静态文件

  3. 项目中有多个py文件,主函数入口py文件,需要能找到这些文件

打包步骤整理如下:

1 环境安装

1.1 创建虚拟环境

  采用virtualenv创建一个新的python虚拟环境,只安装脚本需要的模块,如下所示:

#windows系统
        virtualenv --no-site-package --python="D:\Anaconda3\python.exe" package_test   #在当前目录下,利用virtualenv创建一个空的python虚拟环境,名字为packgae_test
        cd package_test/Scripts  #进入python虚拟环境目录
        ./activate               #激活python虚拟环境
        pip install -i https://pypi.douban.com/simple/ opencv-python zmq mxnet-cu101 gluoncv Pyyaml #通过豆瓣镜像源,安装脚本需要用到的包opencv-python, zmq, mxnet-cu101, gluoncv,pyyaml
   
#linux系统
        virtualenv --no-site-package --python="D:\Anaconda3\python.exe" package_test   #在当前目录下,利用virtualenv创建一个空的python虚拟环境,名字为packgae_test
        cd package_test/bin  #进入python虚拟环境目录
        source ./activate               #激活python虚拟环境
        pip install -i https://pypi.douban.com/simple/ opencv-python zmq mxnet-cu101mkl gluoncv Pyyaml #通过豆瓣镜像源,安装脚本需要用到的包opencv-python, zmq, mxnet-cu101mkl, gluoncv,pyyaml
   

1.2 安装PyInstaller

  采用PyInstaller作为python打包工具,将python脚本打包成单独的exe文件。官方文档:https://pyinstaller.readthedocs.io/en/stable/

pip uninstall setuptools
pip install setuptools==44.0.0   #安装PyInstaller之前需要卸载默认的最新版本的setuptools,安装44.0.0或者之前版本的setuptools
pip install -i https://pypi.douban.com/simple/ PyInstaller  ##通过豆瓣镜像源,安装 PyInstaller

 1.3 Pyinstaller源码编译

  当打包文件的大小超过2G时,pyinstaller打包会失败,需要修改Pyinstaller中的限制,修改后重新编译即可。

1. 从github下载源码(https://github.com/pyinstaller), 修改代码

2. 修改源码后重新编译:
cd /bootloader
python ./waf distclean all

3. 安装编译后的代码:
cd ..
python setup.py install

 

2. 代码整理

  2.1 多个py文件的依赖关系

    确定项目的入口py文件,需要对代码进行整理,确保pyinstaller能通过主文件找到导入的其他py文件。这里有两种方式:

    A. 代码如果比较简单,可以直接将所有代码写入到入口py文件中,简单粗暴。

    B. 代码文件比较复杂,需要在入口py文件中检查下相关导入的import语句(实验中发现通过将sys.path加入包路径的情况,打包后运行时会出现找不到模块的问题),如下面例子中,在main.py中导入detection文件夹下的detection.py文件:

#测试通过的导入方式
from .detection import detection


#运行报错导入方式
import sys
sys.path.append(sys.path[0]+"/detection")
import detection

  2.2 模型文件路径解析问题

    PyInstaller可以将模型文件一起bundle到exe中,当exe在运行时,会生成一个临时文件夹,程序可通过sys._MEIPASS访问临时文件夹中的资源,我们打包进去的模型文件和配置文件也会解压到此处;而程序只会在执行路径下搜索模型文件,因此会找不到模型参数文件,所以需要在代码中将模型参数的路径转化为 “临时文件目录+打包路径” 格式,参见如下resource_path()函数。

def resource_path(relative_path):
    """ Get absolute path to resource, works for dev and for PyInstaller """
    base_path = getattr(sys, '_MEIPASS', os.path.dirname(os.path.abspath(__file__)))
    return os.path.join(base_path, relative_path)

 

3. 脚本打包

  在上面激活的python虚拟环境中,命令行执行下面打包命令

#windows示例
    pyinstaller -F --add-data="D:\my_envs\package\Lib\site-packages\mxnet\*;./mxnet" --add-data="F:\python打包\package_test\param\detection-symbol.json;." --add-binary="F:\python打包\package_test\param\detection--0000.params;." --workpath=“F:\python打包\package_test\build” --distpath="F:\python打包\package_test\build\dist" “F:\python打包\package_test\build\main.py”
    
    命令参数说明如下:
    
    -F 表示生成一个单独的exe
    --add-data="D:\my_envs\package\Lib\site-packages\mxnet\*;./mxnet"   添加虚拟环境中mxnet安装路径下的所有文件 (由于PyInstaller无法寻找到mxnet相关的dll文件,需要指明需要添加的文件)
    --add-data="F:\python打包\package_test\param\detection-symbol.json;."        添加模型结构文件 (;. 表示json文件添加到生成exe的同级目录)
    --add-binary="F:\python打包\package_test\param\detection--0000.params;."     添加模型参数文件 (;. 表示params文件添加到生成exe的同级目录)
    --workpath=“F:\python打包\package_test\build”   打包过程中产生的临时文件和日志文件存放目录
    --distpath="F:\python打包\package_test\dist"  打包生成的exe文件目录
    “F:\python打包\package_test\build\main.py”      为需要打包的入口py文件路径
    
#linux示例
linux的打包命令和windows类似,区别在于下面三个参数中符号区别(windows中;.表示同级目录, linux中:.表示同级目录)
命令参数说明如下: -F 表示生成一个单独的可执行文件 --add-data="/home/my_envs/package_test/lib/python3.7/site-packages/mxnet/*:./mxnet" 添加虚拟环境中mxnet安装路径下的所有文件 (由于PyInstaller无法寻找到mxnet相关的.so文件,需要指明需要添加的文件) --add-data="/home/param/detection-symbol.json:." 添加模型结构文件 (:. 表示json文件添加到生成可执行文件的同级目录) --add-binary="/home/param/detection-0000.params:." 添加模型参数文件 (:. 表示params文件添加到生成可执行文件的同级目录)

 

 

4. 运行exe文件

  打包好的可执行文件在dist目录,第一次运行打包生成的exe文件时需要命令行执行,随后可以双击运行

 

参考文章:

  https://www.cnblogs.com/ylsd80/p/10471936.html

  https://blog.csdn.net/zlc0324/article/details/103697890

  https://blog.csdn.net/m0_37477175/article/details/82146996

标签:文件,PyInstaller,package,python,模型,--,test,打包
From: https://www.cnblogs.com/silence-cho/p/12605074.html

相关文章

  • C++ 知识要点:I/O 模型
    1.使用同步IO模型实现的Reactor模式的工作流程(以epoll_wait为例)在Reactor模式中,主线程(也称为事件循环或分发器)负责监听和分发事件,工作线程负责处理具体的业务逻辑。以下是使用epoll_wait实现Reactor模式的工作流程,详细描述了事件的处理过程:1.主线程往epoll......
  • 存储论——报童问题(单周期)订货模型精解
    报童问题(NewsvendorProblem),最早由哈维·莫德里格利亚尼(HarveyM.Wagner)和托马斯·M·怀特(ThomasM.Whitin)于1958年提出,是运筹学中经典的库存管理问题。其名称源于报童的情境描述,即一个报童每天需要决定订购多少份报纸以最大化利润。报童每天面对报纸需求的不确定性,若订购量太少......
  • Android插件化(三)基础之Android应用程序资源的编译和打包过程分析
    Android插件化(三)基础之Android应用程序资源的编译和打包过程分析Android资源加载常规思路getResourcesForApplication//首先,通过包名获取该包名的Resources对象Resourcesres=pm.getResourcesForApplication(packageName);//根据约定好的名字,去取资源id;intid=res.......
  • Transformer模型-7- Decoder
    概述Decoder也是N=6层堆叠的结构,每层被分3层:两个注意力层和前馈网络层,同Encoder一样在主层后都加有Add&Norm,负责残差连接和归一化操作。Encoder与Decoder有三大主要的不同:第一层MaskedMulti-HeadAttention:采用Masked操作第二层Multi-HeadAttention:K,V矩阵是......
  • ROS和ROS2借助智能大模型的学习和研究方法
    机器人相关知识的本身和价值-CSDN博客知识本身在智能时代毫无价值,需要基于知识应用和创新才有价值。 学历报废并非来自扩招,而是智能模型的快速发展。-CSDNblink-领先的开发者技术社区 2024年中秋,智能模型实力已经如此,但还有大量朋友笃定旧模-CSDNblink-领先的开发者技......
  • 窗口管理(Stage模型)
    基本概念窗口沉浸式能力:指对状态栏、导航栏等系统窗口进行控制,减少状态栏导航栏等系统界面的突兀感,从而使用户获得最佳体验的能力。沉浸式能力只在应用主窗口作为全屏窗口时生效。通常情况下,应用子窗口(弹窗、悬浮窗口等辅助窗口)无法使用沉浸式能力。悬浮窗:全局悬浮窗口是一种......
  • 前端开发转行AI大模型?应该如何准备面试?面试题+答案来了!!!
    一、初探大模型:起源与发展1、预热篇:解码注意力机制1.1注意力机制最早是在哪个领域得到应用的1.2以下哪些方法被用于处理序列数据?1.3以下方法被用于处理序列数据的是1.4注意力机制是什么2、变革里程碑:transformer的崛起2.1Transformer模型和注意力机制的关系2.......
  • fastsam_pytorch图像分割算法模型
    FastSAM论文FastSegmentAnything模型结构以yolov8-seg的instancesegmentation为基础,检测时集成instancesegmentation分支,主要分为两步全实例分割(allinstanceSegmentation)和基于prompt的mask输出(Prompt-guidedSelection),仅使用了2%的SA-1B数据集便得到了差不多的......
  • asr_onnxruntime语音识别模型,实现speech-to-text的转换
    asr_onnx论文无模型结构算法原理数据集无环境配置在光源可拉取推理的docker镜像,在光合开发者社区可下载onnxruntime安装包。asr_onnx推荐的镜像如下:dockerpullimage.sourcefind.cn:5000/dcu/admin/base/pytorch:2.1.0-ubuntu20.04-dtk24.04.1-py3.10cdasr_onn......
  • 面试面经|大模型算法岗常见面试题100道
    本文提供了一份全面的大模型算法岗位面试题清单,包括基础理论、模型结构、训练微调策略、应用框架、分布式训练和模型推理等方面的知识点,旨在帮助求职者准备相关技术面试。一、基础篇1、目前主流的开源模型体系有哪些?Transformer体系:由Google提出的Transformer模型及其......