首页 > 其他分享 >一种PyInstaller中优雅的控制包大小的方法

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

时间:2024-08-27 11:48:10浏览次数:8  
标签:templates PyInstaller name 优雅 filter 大小 binaries datas

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', ...])

标签:templates,PyInstaller,name,优雅,filter,大小,binaries,datas
From: https://www.cnblogs.com/FocusNet/p/18382397

相关文章

  • auto_size_text 自动调整文本大小以适应其容器的 Flutter 插件
    依赖auto_size_text:^3.0.0//自动调整文本大小例子classAutoSizeRichTextExampleextendsStatelessWidget{@overrideWidgetbuild(BuildContextcontext){returnCenter(child:Container(width:double.infinity,child:AutoSi......
  • Java使用EasyExcel导出图片(原比例大小)到Excel中
    EasyExcel导出图片又开始写Excel导出的需求了,哈哈哈……目前的需求是将图表分析对的饼图和折线图,也就是一张完整的图片单独导出到Excel中为了方便客户在业务报告时,可以使用数据分析图片,从而更清晰准确地展示数据趋势因此关键点是将图片原比例尺寸大小导出,不能进行压缩原数......
  • PyInstaller 打包 Python 程序
    使用PyInstaller打包Python程序是一个相对简单直接的过程。PyInstaller允许你将Python程序及其所有依赖项打包成一个独立的可执行文件,这样用户就可以在没有安装Python解释器的系统上运行你的程序了。以下是一个基本的步骤指南,用于使用PyInstaller打包Python程......
  • 【转载】Win11优化大小核调度(无需重启)
    出处:https://bbs.saraba1st.com/2b/thread-2140520-1-1.html打开隐藏电源管理选项:管理员模式运行cmd,分别输入:powercfg-attributesSUB_PROCESSOR7f2f5cfa-f10c-4823-b5e1-e93ae85f46b5-ATTRIB_HIDEpowercfg-attributesSUB_PROCESSOR93b8b6dc-0698-4d1c-9ee4-0644e900c85......
  • Java | Leetcode Java题解之第374题猜数字大小
    题目:题解:publicclassSolutionextendsGuessGame{publicintguessNumber(intn){intleft=1,right=n;while(left<right){//循环直至区间左右端点相同intmid=left+(right-left)/2;//防止计算时溢出......
  • Python3.11二进制AI项目程序打包为苹果Mac App(DMG)-应用程序pyinstaller制作流程(App
    众所周知,苹果MacOs系统虽然贵为Unix内核系统,但由于系统不支持N卡,所以如果想在本地跑AI项目,还需要对相关的AI模块进行定制化操作,本次我们演示一下如何将基于Python3.11的AI项目程序打包为MacOS可以直接运行的DMG安装包,可以苹果系统中一键运行AI项目。MacOs本地部署AI项目首先确......
  • 在Python虚拟环境中利用PyInstaller高效构建可执行EXE文件的专业指南
    使用虚拟环境(如venv或conda)来打包Python程序为exe文件是一个很好的实践,因为它可以确保应用程序在不同的环境中具有一致性和可移植性。然而,需要注意的是,虚拟环境本身并不直接提供将Python程序打包成exe文件的功能。这通常需要使用专门的打包工具,如PyInstaller、cx_Freeze或py......
  • 从菜鸟到高手:掌握Python推导式,让代码飞起来,列表、集合、字典,一网打尽,用Python推导式
    "在Python的广阔世界里,隐藏着一种让程序员们爱不释手的秘密武器——推导式。想象一下,你正站在数据处理的战场上,面对着成千上万条数据,需要快速筛选、转换、聚合。这时,你手中的列表推导、集合推导、字典推导就像三把锋利的剑,轻轻一挥,便能将复杂的数据操作化繁为简,让代码如同行云......
  • C语言使用sizeof,strlen计算数组、指针大小长度汇总
    目录一、字符串数组 二、字符数组 三、int型数组 四、字符指针五、二维数组注意:数组名除了在sizeof()和&()表示数组地址,其他都表示首元素地址。地址所占字节4(32位)/8(64位)。一、字符串数组 chararr[]={"abcdef"};sizeof解析strlenarr7包括\06arr+04/8首元素地址+0......
  • Python的OpenCV转换图像大小
    在Python中,使用OpenCV库来转换图像大小是一个常见的操作,它可以帮助你调整图像到特定的尺寸,以适应不同的应用场景,比如图像预处理、模型输入等。下面是一个详细的代码示例,展示了如何使用OpenCV来转换图像的大小。首先,确保你已经安装了OpenCV库。如果还没有安装,可以通过pip安装:bash......