Pyinstaller - Python桌面应用打包的首选工具 - 详解

news/2025/11/13 23:02:58/文章来源:https://www.cnblogs.com/gccbuaa/p/19219826

大家好,我是唐叔。上次我们讲解了 Python+Web构建桌面应用的最佳选择 - Pywebview,那么写好的Python程序,如何在别人的电脑上运行?总不能要求每个人都安装Python、配置环境吧?这时候,PyInstaller 就派上用场了。

文章目录

    • 一、PyInstaller 是什么?
    • 二、安装PyInstaller
    • 三、快速上手:打包第一个应用
      • 3.1 基础打包命令
      • 3.2 打包为单个文件
      • 3.3 隐藏命令行窗口
      • 3.4 自定义应用图标
    • 四、进阶技巧:优化与实战
      • 4.1 解决打包文件过大问题
      • 4.2 多程序文件打包
      • 4.3 静态资源打包(如图片、HTML)
    • 五、总结

一、PyInstaller 是什么?

PyInstaller 是一个强大的Python应用程序打包工具,它能将你的Python脚本及其所有依赖项(包括解释器、模块、库等)打包成一个独立的可执行文件(如.exe)。用户无需安装Python,双击即可运行!

原理小贴士:PyInstaller 会递归分析你的代码,找出所有被导入的模块,确保所有依赖都被正确打包。

适用场景

  • 开发GUI桌面应用(如PyQt、Tkinter、pywebview)
  • 制作小工具或脚本,供非技术人员使用
  • 需要跨Windows、macOS、Linux分发Python程序

二、安装PyInstaller

安装非常简单,只需一行命令:

pip install pyinstaller

建议在虚拟环境中安装,避免污染全局环境。

三、快速上手:打包第一个应用

我们以一个简单的 pywebview 示例为例:

import webview
if __name__ == '__main__':
webview.create_window('Demo', 'https://pyinstaller.org')
webview.start()

保存为 demo.py,接下来我们开始打包。

3.1 基础打包命令

pyinstaller demo.py

执行后,会在当前目录生成 dist 文件夹,里面就是打包好的应用程序。你可以将整个 dist 文件夹发给别人使用。

3.2 打包为单个文件

如果你不想发整个文件夹,可以使用 -F 参数:

pyinstaller -F demo.py

这样就会生成一个独立的 .exe 文件,方便分发。

✅ 提示:--onefile-F 的全称,效果相同。

3.3 隐藏命令行窗口

如果你打包的是GUI程序,不希望出现命令行窗口,可以使用 -w 参数:

pyinstaller -F -w demo.py

✅ 提示:-w--windowed--noconsole 三者等价。

3.4 自定义应用图标

使用 -i 参数可以指定图标文件(需为 .ico 格式):

pyinstaller -F -w -i logo.ico demo.py

四、进阶技巧:优化与实战

4.1 解决打包文件过大问题

打包后文件太大?最常见的原因是打包了不必要的依赖。

方法一:手动排除冗余模块

例如,使用 pywebview 时,默认会打包 PyQt,导致体积暴增。我们可以手动排除:

pyinstaller -F -w --exclude-module PyQt6 demo.py

从186MB降到13.7MB,效果显著!

方法二:使用独立虚拟环境

如果你不确定哪些模块是冗余的,建议在干净的虚拟环境中打包:

python -m venv myenv
myenv\Scripts\activate  # Windows
pip install pyinstaller pywebview
pyinstaller -F -w demo.py

这样打包出来的文件只有10MB,更小,也更干净。

有关python独立环境创建的详细教程,唐叔后续将专门章节展开介绍,敬请期待。

4.2 多程序文件打包

如果你的项目有多个 .py 文件,不用担心,PyInstaller 会自动递归分析依赖,并将其一并打包。

例如:

project/├── demo.py└── module/└── asset.py

只需打包主文件:

pyinstaller -F -w demo.py

PyInstaller 会自动识别并打包 asset.py

当然你也可以使用 --collect-submodules 手动指定打包模块,这里就不展开了。

4.3 静态资源打包(如图片、HTML)

如果你的程序使用了外部文件(如图片、HTML、配置文件),可以使用 --add-data 参数:

pyinstaller -F -w --add-data "index.html;." demo.py

需要注意: 在代码中,你需要使用 pathlibsys._MEIPASS 来正确获取资源路径:

import pathlib
folder = pathlib.Path(__file__).parent.resolve()
with open(folder / 'index.html', 'r', encoding='utf-8') as f:
html = f.read()

这样就能在打包后正确读取静态文件了。未正确获取资源路径,可能会报错:FileNotFoundError

五、总结

PyInstaller 是Python开发者必备的打包工具,无论是GUI程序、命令行工具,还是带资源文件的项目,它都能胜任。

本文要点回顾

  • 使用 -F 打包为单文件,-w 隐藏命令行
  • 使用 -i 自定义图标
  • 通过 --exclude-module 或虚拟环境优化体积
  • 使用 --add-data 打包静态资源

如果你正在学习Python桌面开发,或希望将自己的脚本分享给他人,PyInstaller 绝对是你的首选工具。

附:资源&参考链接

如果有任何问题,欢迎在评论区留言,唐叔会尽力解答!

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.mzph.cn/news/964803.shtml

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

DNS record types: AAAA vs AA All In One

DNS record types: AAAA vs AA All In One DNS AAAA 记录将域名与 IPv6 地址进行匹配,这与 A 记录相似,后者对 IPv4 地址进行同样的操作。DNS record types: AAAA vs AA All In OneDNS AAAA 记录将域名与 IPv6 地址进…

关于Langchain更新解决Memory的引用

结合我之前的文章,关于调用memory的部分改成如下所示(老版本也可用,只不过不适配新版本的Langchain) langchain版本均采用最新版本,同时,Python版本要在3.10以上,详情可参考Langchain官方文档 from langchain_c…

win7 打开 icmp-ping 回显

需要放开防火墙 ICMP 规则选项: 执行以下命令:netsh firewall set icmpsetting 8type - ICMP 类型2 - 允许出站数据包太大。3 - 允许出站目标不可访问。4 - 允许出站源抑制。5 - 允许重定向。8 - 允许入站…

旋转矩阵在导航与机器人中的应用

在组合导航、无人机控制、机器人运动学等领域,旋转矩阵是连接参考坐标系与载体坐标系的核心工具,而欧拉角旋转顺序则决定了姿态描述的逻辑与精度。本文将聚焦最常用的三种旋转顺序,从基础原理、旋转矩阵推导到实际应…

JVM之锁优化(自旋锁 适应性自旋 锁消除 锁粗化 轻量级锁 偏向锁) - 教程

JVM之锁优化(自旋锁 适应性自旋 锁消除 锁粗化 轻量级锁 偏向锁) - 教程pre { white-space: pre !important; word-wrap: normal !important; overflow-x: auto !important; display: block !important; font-family: …

Tavus发布多模态数字伙伴PALs,能看、听、推理;李飞飞团队推出首款商用世界模型World Labs Marble丨日报

开发者朋友们大家好:这里是 「RTE 开发者日报」 ,每天和大家一起看新闻、聊八卦。我们的社区编辑团队会整理分享 RTE(Real-Time Engagement) 领域内「有话题的技术」、「有亮点的产品」、「有思考的文章」、「有态…

实用指南:每日一个C语言知识:C 数组

pre { white-space: pre !important; word-wrap: normal !important; overflow-x: auto !important; display: block !important; font-family: "Consolas", "Monaco", "Courier New", …

Android 对话框 - 对话框全屏显示(设置 Window 属性、采用自定义样式、继承 DialogFragment 达成、继承 Dialog 建立)

Android 对话框 - 对话框全屏显示(设置 Window 属性、采用自定义样式、继承 DialogFragment 达成、继承 Dialog 建立)pre { white-space: pre !important; word-wrap: normal !important; overflow-x: auto !importa…

2025年陕西短视频制作服务商TOP5实力榜:AI赋能内容创作新时代

随着短视频成为企业品牌传播和流量获取的核心阵地,市场对专业制作服务商的需求持续攀升。本榜单基于技术创新力、行业服务经验、客户满意度及AI应用能力四大维度,结合本地企业服务案例数据,全面解析2025年陕西地区五…

面试官问:什么是Java内存模型? - 教程

面试官问:什么是Java内存模型? - 教程pre { white-space: pre !important; word-wrap: normal !important; overflow-x: auto !important; display: block !important; font-family: "Consolas", "Mo…

Spring AI Alibaba 项目源码学习(四)-Graph中的存储分析

Store 存储系统分析 请关注微信公众号:阿呆-bot 概述 本文档分析 spring-ai-alibaba-graph-core 模块中的 Store 存储系统,包括接口设计、实现模式、支持的存储类型和关键设计点。 入口类说明 Store - 存储接口 Stor…

20251113 正睿

A给定 \(n, m, k\),需要构造一个数组 \(a\),使得 \(a_i\) 为 \([1, m]\) 的整数且 \(\sum \gcd(i, i + 1) = k\) \(n \le 10^5, m \le 10^{12}, n - 1 \le k \le (n - 2)m\),可以证明有解。对于这种类型的构造题,结…

好消息,.NET 10 正式发布,更智能、更安全、更高性能的统一开发平台!

前言 好消息,.NET 团队于 2025 11 月 11 日宣布 .NET 10 正式发布,这是迄今为止最高效、最现代、最安全、最智能且性能最高的 .NET 版本。长期支持版本(LTS) .NET 10 是一个长期支持版本(LTS) ,将支持三年 ,直…

从Dalvik字节码角度优化安卓编码

目录静态属性与this指针字段与局部变量final属性与编译优化内部类与桥接方法匿名类与Lambda小结 安卓开发中,Java/Kotlin等高级语言被编译成.class字节码,之后通过dx/d8、r8等工具编译成dex文件(Dalvik字节码),打…

基于Java+SSM+Flask家庭理财系统(源码+LW+调试文档+讲解等)/家庭理财/理财系统/家庭财务/家庭财务规划/家庭账目/家庭财务软件/家庭记账/理财器具/财务多元化/资产管理。

pre { white-space: pre !important; word-wrap: normal !important; overflow-x: auto !important; display: block !important; font-family: "Consolas", "Monaco", "Courier New", …

.NET Conf China 2025:讲师与主题全揭秘

.NET Conf China 2025:讲师与主题全揭秘备受期待的第七届.NET中国峰会——.NET Conf China 2025,即将于11月30日在上海盛大举行。本次大会聚焦性能跃升、AI融合、跨平台开发三大核心方向,邀请了来自国内外知名科技企…

深入解析:洞穴人的仰望:洞穴人隐喻与进步主义的歧途

pre { white-space: pre !important; word-wrap: normal !important; overflow-x: auto !important; display: block !important; font-family: "Consolas", "Monaco", "Courier New", …

《JIRA:项目管理与敏捷开发实践》

1、非修改序列算法 这些算法不会改变它们所操作的容器中的元素。 1.1 find 和 find_if find(begin, end, value):查找第一个等于 value 的元素,返回迭代器(未找到返回 end)。 find_if(begin, end, predicate):查找…

20232319 2025-2026-1 《网络与系统攻防技术》实验五实验报告

1.实验内容 任务1:DNS域名信息查询 任务2:获取好友IP地址及地理地址 任务3:使用nmap扫描靶机 任务4:使用Nessus扫描靶机 任务5:网络足迹与Google hacking 2.实验过程 2.1 DNS域名信息查询 2.1.1 查询baidu.com的I…

主动交互和情境感知,AI 硬件是脱离手机屏幕掌控的蓝海机会丨硬件和端侧模型专场@RTE2025 回顾

在本届 RTE2025 大会上,来自产业界和学术界的多位专家深入探讨了 AI 硬件、端侧小模型的发展趋势、架构创新、低功耗解决方案以及语音技术与大模型的深度融合。Rokid 全球创新产品、工程和开放生态负责人赵维奇、Folo…