首页 星云 工具 资源 星选 资讯 热门工具
:

PDF转图片 完全免费 小红书视频下载 无水印 抖音视频下载 无水印 数字星空

一种PyInstaller中优雅的控制包大小的方法

编程知识
2024年08月27日 10:49

PyInstaller会在打包时自动为我们收集一些依赖项,特别是我们在打包PyQt/PySide相关的应用时,PyInstaller会自动包含我们程序通常不需要的文件,如'tanslations'文件夹,'plugins/imageformats'等,通常这些文件会使我们最终的exe文件变大。在网上没有找任何好的方法来排除这些文件,从这个Issue https://github.com/pyinstaller/pyinstaller/issues/5503 里我们可以看到一种方法就是在打包之前先删除PyQt安装目录中的不需要文件,这种做法能达到目的,但在我看来实在是不够优雅。

PyInstaller其实最终都依靠spec文件来获取依赖及其它配置项,而生成spec文件内容是由一个模板(https://github.com/pyinstaller/pyinstaller/blob/develop/PyInstaller/building/templates.py)控制, 所以我们可以在生成之前去修改(patch)下这个模板,就可以达到控制依赖项的目的。

以下假设我们是通过代码方式来调用Pyinstaller,并使用onefile模式(onedir模块可参照修改).

注意以下Analysis语句后面的代码即为处理datas和binaries的代码,在这里可以添加任何过滤逻辑

import PyInsatller.building.templates as pyi_spec_templates
from PyInstaller.__main__ import run as pyi_build

# copy from PyInsatller.building.templates.py
# add datas and binaries filter after Analysis
onefiletmplate = """# -*- mode: python ; coding: utf-8 -*-
%(preamble)s

a = Analysis(
    %(scripts)s,
    pathex=%(pathex)s,
    binaries=%(binaries)s,
    datas=%(datas)s,
    hiddenimports=%(hiddenimports)s,
    hookspath=%(hookspath)r,
    hooksconfig={},
    runtime_hooks=%(runtime_hooks)r,
    excludes=%(excludes)s,
    noarchive=%(noarchive)s,
    optimize=%(optimize)r,
)

# begin filter any datas you want
datas = []
for dest_name, src_name, res_type in a.datas:
    # 在这里添加过滤逻辑
    datas.append((dest_name, src_name, res_type))
a.datas = datas
# end filter datas

# begin filter any binaries you want
binaries = []
for dest_name, src_name, res_type in a.binaries:
    # 在这里添加过滤逻辑
    binaries.append((dest_name, src_name, res_type))
a.binaries = binaries
# end filter datas

pyz = PYZ(a.pure)
%(splash_init)s
exe = EXE(
    pyz,
    a.scripts,
    a.binaries,
    a.datas,%(splash_target)s%(splash_binaries)s
    %(options)s,
    name='%(name)s',
    debug=%(debug_bootloader)s,
    bootloader_ignore_signals=%(bootloader_ignore_signals)s,
    strip=%(strip)s,
    upx=%(upx)s,
    upx_exclude=%(upx_exclude)s,
    runtime_tmpdir=%(runtime_tmpdir)r,
    console=%(console)s,
    disable_windowed_traceback=%(disable_windowed_traceback)s,
    argv_emulation=%(argv_emulation)r,
    target_arch=%(target_arch)r,
    codesign_identity=%(codesign_identity)r,
    entitlements_file=%(entitlements_file)r,%(exe_options)s
)
"""

pyi_spec_templates.onefiletmplt = onefiletmplate  # ==> patch the template string here

# build exe
pyi_build(['main.py', '--onefile', ...])
From:https://www.cnblogs.com/FocusNet/p/18382397
本文地址: http://shuzixingkong.net/article/1481
0评论
提交 加载更多评论
其他文章 SRE 必备知识 - Kafka 探秘之零拷贝技术
如果你了解过 Kafka,那么它用到的一个性能优化技术可能会引起你的注意 -- 操作系统的零拷贝(zero-copy)优化。 零拷贝操作可以避免对数据的非必要拷贝,当然,并非是说完全没有拷贝。 在 Kafka 的场景下,操作系统可以从 page cache 拷贝数据到 socket buffer,直
SRE 必备知识 - Kafka 探秘之零拷贝技术 SRE 必备知识 - Kafka 探秘之零拷贝技术 SRE 必备知识 - Kafka 探秘之零拷贝技术
.NET 开源实时监控系统 - WatchDog
前言 在平时的开发中随着我们系统应用不断地迭代变的复杂,对应用的实时监控变得越来越重要。实时监控不仅可以帮助我们快速定位问题,还能在出现问题时及时采取措施,减少业务中断的时间。 本文将介绍一个名为WatchDog的.NET开源实时应用监控系统,它可以帮助我们轻松实现对.NET应用的实时监控。 项目介
.NET 开源实时监控系统 - WatchDog .NET 开源实时监控系统 - WatchDog .NET 开源实时监控系统 - WatchDog
月老情侣交友盲盒4.0.x任意文件写入漏洞
月老情侣交友盲盒4.0.x任意文件写入漏洞 月老情侣交友盲盒4.0.x任意文件写入漏洞 月老情侣交友盲盒4.0.x任意文件写入漏洞
PyJWT 和 python-jose 在处理JWT令牌处理的时候的差异和具体使用
PyJWT 和 python-jose 是两个用于处理 JSON Web Tokens (JWT) 的 Python 库。它们都有助于生成、解码、验证和管理 JWT,但它们在功能范围和设计哲学上有一些重要的区别。本篇介绍它们之间的一些差异,以及在项目中使用FastAPI+ python-jose 来
PyJWT 和 python-jose 在处理JWT令牌处理的时候的差异和具体使用 PyJWT 和 python-jose 在处理JWT令牌处理的时候的差异和具体使用
Daph:新一代流批一体数据集成与数据处理工具
Daph源码位于gitee,地址是https://gitee.com/dasea96/daph 概述 Daph的中文名称是大副,大副是职位仅低于船长的船舶驾驶员,甲板部(驾驶部)负责人,船长的主要助手。 Daph的英文名称,取自【有向无环图Directed Acyclic Graph】的第一个字母与
Daph:新一代流批一体数据集成与数据处理工具 Daph:新一代流批一体数据集成与数据处理工具 Daph:新一代流批一体数据集成与数据处理工具
记一次 .NET某实验室自动进样系统 崩溃分析
一:背景 1. 讲故事 前些天有位朋友在微信上联系到我,说他们的程序在客户那边崩掉了,让我帮忙看下怎么回事,dump也拿到了,那就上手分析吧。 二:WinDbg 分析 1. 哪里的崩溃 既然是程序的崩溃,自然是有原因的,皮裤套棉裤,必定有缘故,不是皮裤太薄就是棉裤没毛,用 !analyze -v 观
记一次 .NET某实验室自动进样系统 崩溃分析 记一次 .NET某实验室自动进样系统 崩溃分析
基于Material Design风格开源的Avalonia UI控件库
前言 今天大姚给大家分享一款基于Material Design风格开源、免费(MIT License)的Avalonia UI控件库:Material.Avalonia。 当前项目还处于alpha阶段。 Avalonia介绍 Avalonia是一个强大的框架,使开发人员能够使用.NET创建跨平台应用
基于Material Design风格开源的Avalonia UI控件库 基于Material Design风格开源的Avalonia UI控件库 基于Material Design风格开源的Avalonia UI控件库
《数据资产管理核心技术与应用》读书笔记-第四章:数据质量的技术实现(二)
质量数据采集到的是原始的数据,由于数据质量规则众多,所以每一种规则采集到的原始数据可能都不一样,所以还需要对原始的数据做归一化处理,然后才能进行入库存储
《数据资产管理核心技术与应用》读书笔记-第四章:数据质量的技术实现(二) 《数据资产管理核心技术与应用》读书笔记-第四章:数据质量的技术实现(二) 《数据资产管理核心技术与应用》读书笔记-第四章:数据质量的技术实现(二)