当前位置: 首页 > article >正文

Pyinstaller打包

打包配置

打包方法

方法一 直接打包

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 sys

def 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 sys

def 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.kler.cn/a/505721.html

相关文章:

  • C++ 文字识别OCR
  • Redisson
  • BI 是如何数据分析的?
  • 微信小程序获取openid
  • uni-app的学习
  • 「实战应用」如何为DHTMLX JavaScript 甘特图添加进度线
  • Python与Excel:开启自动化办公新时代
  • AudioGPT全新的 音频内容理解与生成系统
  • 深入理解 MySQL 中 FIND_IN_SET 函数在查询中的应用
  • 美化IDE之修改IDEA启动界面logo图片
  • laravel中请求失败重试的扩展--Guzzle
  • 【Hive】海量数据存储利器之Hive库原理初探
  • mysql,PostgreSQL,Oracle数据库sql的细微差异(2) [whith as; group by; 日期引用]
  • 24-25-1-单片机开卷部分习题和评分标准
  • SpringBoot工程快速启动
  • Chatper 4: Implementing a GPT model from Scratch To Generate Text
  • 为独特工作流设计 K8s 健康检查(Design k8s Health Check for Unique Workflow)
  • citrix netscaler13.1 重写负载均衡响应头(基础版)
  • 如何利用.NET版PDF处理控件Aspose.PDF,使用 C# 从 PDF 中删除水印
  • SpringCloud-Alibaba搭建
  • 用 Python 从零开始创建神经网络(二十二):预测(Prediction)/推理(Inference)(完结)
  • 1.5 安装Kuboard在页面上熟悉k8s集群
  • 使用verilog设计推箱子游戏
  • C#,任意阶幻方(Magic Square)的算法与源代码
  • 【GRACE学习-1】JPL数据下载
  • BI 是如何数据分析的?