Python打包之嵌入式打包神器PyStand

news/2024/10/18 14:15:02/

在使用Python开发项目时,如果项目依赖了如torch这样的大型第三方库,打包后的体积可能会变得非常庞大(超过1GB)。传统的打包工具,如Nuitka或PyInstaller,可能会面临打包成功率低、耗时长、打包后体积巨大的问题。

        为了解决这一问题,龙哥试了几种打包方法,各有好处。本文将探讨一种嵌入式打包的方法,即只分发解释器和核心代码,而第三方依赖则在用户第一次使用程序时现场安装。

解决思路

        通过嵌入式打包,我们可以显著减少分发包的大小。用户在第一次运行程序时,程序会自动安装所需的第三方依赖。这种方法不仅减少了分发包的体积,也避免了传统打包方式可能出现的漏包问题。

示例代码

        本文使用的软件版本为Python 3.10.9。如果你对嵌入式打包不太了解,可以先阅读相关的文章。以下是一个简单的示例项目结构和代码。

项目结构

 

app.py入口文件

python">from app.main import main
if __name__=="__main__":main()

打包准备

  1. 准备项目依赖:在项目环境中运行pip freeze > requirements.txt来导出依赖文件。
  2. 准备嵌入式解释器:可以直接从python官方网站下载。
  3. 准备PyStand壳:从GitHub下载PyStand。
  4. 准备get-pip.py:用于下载pip工具,可以从bootstrap.pypa.io/get-pip.py获取。

开始打包

  • 将代码复制到PyStand同级目录的app文件夹中,并将main.py的内容复制到PyStand的pystand.int文件中,文件重命名_pystand_static.int。
  • runtime文件夹内新建download.py文件,用于在首次运行时安装依赖。 
python">import os
import sys
from pathlib import Pathprint("第一次启动,缺少环境依赖,开始安装依赖,请保持网络畅通")
python_path = Path(sys.exec_prefix).joinpath("python.exe")
get_pip_script = Path(sys.exec_prefix).joinpath("get-pip.py")
command = f"{python_path} {get_pip_script}"  # 安装pip工具
os.system(command)
requirements_path = Path(sys.exec_prefix).joinpath("requirements.txt")  # 安装其他依赖
# 安装依赖,这是阿里源
command = str(python_path) + " -m pip install --no-warn-script-location -i https://mirrors.aliyun.com/pypi/simple/ -r" + f"{requirements_path}"
status_code = os.system(command)
# 然后退出程序,提醒用户重启
if status_code != 0:input("依赖安装失败")
else:input("依赖安装完成,请重新打开程序,按回车键退出")
sys.exit()

  • 修改pystand.int文件,捕获ModuleNotFoundError错误,并调用runtime文件夹中的Python解释器运行download.py脚本。
python">
import os
import systry:from app.main import main
except ModuleNotFoundError:from pathlib import Pathpython_path = Path(sys.exec_prefix).joinpath("python.exe")download_script = Path(sys.exec_prefix).joinpath("download.py")command = f"{python_path} {download_script}"os.system(command)sys.exit()if __name__=="__main__":main()
  • requirements.txt文件放置在runtime文件夹中。
  • 修改runtime文件夹中的._pth文件,取消import site前的注释。同时加入项目包目录../app
  • 删除PyStand同级目录的sitepackage文件夹。

最后目录如下。pystand.exe 可以任意修改名字

测试

  1. 双击PyStand,程序会提示缺少依赖并开始安装。
  2. 安装完成后,提示用户重启程序。
  3. 重新双击PyStand,程序将正常启动。

        这样就完美实现小体积分发。打包难度也降低不少。听方便的,至于代码加密,可以用以下几种方法

  1. pyarmor直接加密项目包替换app目录
  2. nuitka 好像把py可以转成pyd,具体没操作
  3. 大家有什么更好的方法可以评论区放出来交流学习一下

最后运行,完美显示。随便写的一个游戏小工具。但是这样其实挺占空间。就这样吧,硬盘反正不值钱了

额外讲解

        这种打包方式利用pip工具让用户在线安装依赖,分发体积小,避免了传统打包方式的缺点。特别适合依赖大型库的项目。用户无需关心本地Python环境,第三方库将被安装在runtime\Lib\site-packages文件夹下。

        对于依赖torch等大型库的项目,可以将依赖文件拆分为两份,分别安装。这样可以确保torch等库的正确安装。


http://www.ppmy.cn/news/1540019.html

相关文章

4.stable-diffusion-webui1.10.0--图像修复(adetailer)插件

ADetailer是Stable Diffusion WebUI的一个插件,它通过深度学习模型智能检测图像中的人脸、手部及身体等关键部位,并自动进行重绘修复,使得生成的图像更加自然、符合预期。 ADetailer插件主要应用于图像的细节增强、降噪和修复,特…

hive自定义函数缺包报错,以及运行时与hive冲突解决

一.问题描述 仅描述了从配置到打包上传的过程&#xff0c;想要看解决请直接跳到下文的对应模块。 在使用hive设置自定义函数的时候在pom.xml中配置如下依赖&#xff0c;使其打包的时候带依赖打包&#xff1a; <dependencies><dependency><groupId>org.apa…

递归——二叉树中的深搜

文章目录 计算布尔二叉树的值求根节点到叶节点数字之和二叉树剪枝验证二叉搜索树二叉搜索树中第 K 小的元素二叉树的所有路径 二叉树中的深搜有三种方法 前序遍历 根->左子树->右子树 中序遍历 左子树->根->右子树 前序遍历 左子树->右子树->根 计算布尔…

【人工智能】大模型的崛起为AI Agent注入了“聪明的大脑”,彻底改变了定义!

在人工智能的迅猛发展中&#xff0c;大模型的崛起为AI Agent注入了“聪明的大脑”&#xff0c;彻底改变了其定义。如今&#xff0c;基于大模型的AI Agent架构已成为企业应用大模型的首选方案。本文将深入探讨AI Agent的构建、框架选择及其在实际应用中的重要性&#xff0c;帮助…

PCL 点云配准-4PCS算法(粗配准)

目录 一、概述 1.1原理 1.2实现步骤 1.3应用场景 二、代码实现 2.1关键函数 2.1.1 加载点云数据 2.1.2 执行4PCS粗配准 2.1.3 可视化源点云、目标点云和配准结果 2.2完整代码 三、实现效果 3.1原始点云 3.2配准后点云 PCL点云算法汇总及实战案例汇总的目录地址链接…

前端开发学习(一)VUE框架概述

一、MVC模式与MVVM模式 1.1mvc模式 MVC模式是移动端应用广泛的软件架构之一&#xff0c;MVC模式将应用程序划分为3部分:Model(数据模型)、View(用户界面视图)和Controller(控制器)。MVC模式的执行过程是将View层展示给用户&#xff0c;也就是通过 HTML页面接受用户动作&#…

SaaS 为小型企业带来的十大优势

软件即服务&#xff08;SaaS&#xff09;已被各种规模的企业所采用。最近&#xff0c;我们可以清楚地看到 SaaS 为小企业带来的显著好处。如果没有 SaaS&#xff0c;中小企业将无法在竞争中生存。 但在云计算中&#xff0c;SaaS 究竟是什么呢&#xff1f;为什么小企业应该关注…

影视制作中心15个工作站同时用Adobe Premiere处理25个4K视频流

对于4K非编人员来说&#xff0c;高分辨率视频编辑卡顿令人抓狂。但素材越来越多&#xff0c;项目越来越大&#xff0c;如何避免卡顿问题&#xff1f; 要知道影视制作过程中对后端存储的性能与容量有较高要求。我们测试在4K非编环境里&#xff0c;10-15台工作站同时运行Adobe P…