Pyinstaller打包

ops/2025/1/15 4:46:33/

打包配置

打包方法

方法一 直接打包

sh

pyinstaller --onefile script.py

方法二 通过配置spec文件打包

sh

pyinstaller script.spec

常见问题

问题1.Exception Type: FileNotFoundError

pyinstaller打包,如何添加静态文件,比如app\\resources\\data\\version_list.json

在使用PyInstaller打包Python应用程序时,添加静态文件(如app/resources/data/version_list.json)可以通过以下几种方法实现:

方法1:使用--add-data选项

这是最常用的方法,通过--add-data选项可以指定要包含的文件及其目标路径。具体命令如下:

sh复制

pyinstaller --add-data "app/resources/data/version_list.json;app/resources/data" script.py
  • app/resources/data/version_list.json是源文件的路径。

  • app/resources/data是目标路径,即打包后文件在临时目录中的相对路径。

  • 在Windows上,路径分隔符是;,在Linux和macOS上是:

方法2:编辑.spec文件

如果你已经生成了.spec文件,可以通过编辑该文件来添加静态文件。首先,使用以下命令生成.spec文件:

sh复制

pyinstaller --onefile script.py

这将生成一个script.spec文件。然后,编辑该文件,在Analysis部分的datas列表中添加你的文件:

Python复制

a = Analysis(['script.py'],...datas=[('app/resources/data/version_list.json', 'app/resources/data')],...)

最后,使用.spec文件重新打包:

sh复制

pyinstaller script.spec

方法3:在代码中动态获取资源文件路径

为了确保程序在打包后能够正确找到资源文件,可以在代码中使用sys._MEIPASS来动态获取资源文件的路径。以下是一个示例函数,用于获取资源文件的路径:

Python复制

import os
import sysdef get_resource_path(relative_path):if hasattr(sys, '_MEIPASS'):return os.path.join(sys._MEIPASS, relative_path)return os.path.join(os.path.abspath("."), relative_path)# 使用示例
version_list_path = get_resource_path("app/resources/data/version_list.json")

这个函数会根据程序是直接从源代码运行还是从打包后的可执行文件运行,来返回正确的资源文件路径。

完整示例

假设你的项目结构如下:

复制

project/
│
├── app/
│   ├── resources/
│   │   └── data/
│   │       └── version_list.json
│   └── ui/
│       └── tool/
│           └── pc_decrypt/
│               └── pc_decrypt.py
│
└── main.py

你可以在main.py中使用以下代码来获取version_list.json文件的路径:

Python复制

import os
import sysdef get_resource_path(relative_path):if hasattr(sys, '_MEIPASS'):return os.path.join(sys._MEIPASS, relative_path)return os.path.join(os.path.abspath("."), relative_path)# 使用示例
version_list_path = get_resource_path("app/resources/data/version_list.json")# 读取文件内容
with open(version_list_path, 'r') as file:version_list = file.read()print(version_list)

然后使用以下命令打包:

sh复制

pyinstaller --add-data "app/resources/data/version_list.json;app/resources/data" main.py

这样,打包后的可执行文件在运行时就能正确找到并读取version_list.json文件了。

问题二 找不到模块

如果打包后运行提示找不到某些模块,可以:

使用 --hidden-import 参数手动添加
在spec文件中的 hiddenimports 列表中添加

问题三. 文件路径问题

在打包后的程序中,需要特别注意文件路径的处理:

import os
import sys

# 获取程序运行时的真实路径
if getattr(sys, 'frozen', False):
    application_path = os.path.dirname(sys.executable)
else:
    application_path = os.path.dirname(os.path.abspath(__file__))


问题四.减小文件体积

通过以下方法减小打包后的文件体积:

使用虚拟环境,只安装必要的依赖
使用 --exclude-module 排除不需要的模块
使用UPX压缩(如果可用)


注意事项

始终使用虚拟环境进行开发和打包
仔细检查依赖项,避免包含不必要的模块
在目标平台上测试打包后的程序
保存并管理spec文件,方便后续修改和重新打包
记录打包过程中的问题和解决方案


http://www.ppmy.cn/ops/150201.html

相关文章

浅谈云计算01 | 云计算服务的特点

在当今数字化时代,云计算作为一种强大的技术解决方案,正逐渐改变着企业和个人对信息技术的使用方式。本文将详细探讨云计算的五个主要特点,包括按需自助服务、广泛的网络接入、资源池化、快速弹性伸缩以及可计量服务。 一、按需自助服务 云…

利用Python爬虫按图搜索1688商品(拍立淘)的探索之旅

在当今这个信息爆炸的时代,网购已成为人们生活中不可或缺的一部分。而1688作为国内知名的B2B电商平台,汇聚了海量的商品资源。当我们面对琳琅满目的商品时,传统的文字搜索方式有时会显得力不从心。比如,当你看到一件心仪的商品图片…

【零基础入门Go语言】Go语言的一等公民:函数和方法

函数和方法是我们迈向代码复用,多人协作开发的第一步。通过函数,可以把开发任务分解成一个个小的单元,这些小单元可以被其他单元复用,进而提升开发效率、降低代码重复度。再加上现成的函数已经被充分测试和使用过,所以…

35_Lua基本语法

Lua 是一种轻量级、易于学习的脚本语言,其语法简洁明了。下面来给大家介绍下Lua的一些基本语法,我们可以创建第一个Lua程序! 1.Lua基本语法 1.1 交互式编程 Lua支持交互式编程,这使得用户可以在命令行界面(CLI)即时执行代码片段并立即看到结果。这种交互式的环境通常被…

腾讯云AI代码助手编程挑战赛-脑筋急转弯

作品简介 一个生成脑筋急转弯的网页工具,提升思维能力。 技术架构 使用Html语言完成图形化页面的样式,使用JavaScript语言来操作对应的逻辑代码。 实现过程 1、创建一个界面 2、获取数据 3、添加按钮与功能 4、程序优化调试 开发环境、开发流程 系…

面试加分项:Android Framework PMS 全面概述和知识要点

在Android面试时,懂得越多越深android framework的知识,越为自己加分。 目录 第一章:PMS 基础知识 1.1 PMS 定义与工作原理 1.2 PMS 的主要任务 1.3 PMS 与相关组件的交互 第二章:PMS 的核心功能 2.1 应用安装与卸载机制 2.2 应用更新与版本管理 2.3 组件管理 第…

鸿蒙面试 2025-01-09

鸿蒙分布式理念?(个人认为理解就好) 鸿蒙操作系统的分布式理念主要体现在其独特的“流转”能力和相关的分布式操作上。在鸿蒙系统中,“流转”是指涉多端的分布式操作,它打破了设备之间的界限,实现了多设备…

Springboot内置Apache Tomcat 安全漏洞(CVE-2024-50379)

背景 大家都知道我们使用Springboot开发后,无需再额外配置tomcat,因为Springboot已经帮我们内置好了tomcat。 这次在线上安全团队就扫出来了我们Springboot服务的tomcat漏洞: 可以看到这是2023年的洞,Apache Tomcat 安全漏洞(…