news 2026/4/3 3:39:39

Day 32:【99天精通Python】打包发布 (PyInstaller) - 让你的程序脱离环境运行

作者头像

张小明

前端开发工程师

1.2k 24
文章封面图
Day 32:【99天精通Python】打包发布 (PyInstaller) - 让你的程序脱离环境运行

Day 32:【99天精通Python】打包发布 (PyInstaller) - 让你的程序脱离环境运行

前言

欢迎来到第32天!

经过一个多月的学习,你已经能写出各种有趣的程序了:爬虫、Excel 自动化、GUI 小工具等等。但是,当你兴奋地把.py代码发给不懂编程的朋友时,通常会收到这样的回复:

“它怎么打不开啊?”
“我是不是要安装什么 Python?”
“报错说缺少模块…”

为了让你的程序能在任意一台电脑(哪怕没装 Python)上运行,我们需要将代码打包成可执行文件(如 Windows 的.exe,Mac 的.app)。

今天,我们就来学习 Python 打包界的神器——PyInstaller

本节内容:

  • 安装 PyInstaller
  • 基本打包命令
  • 常用参数详解 (-F,-w,-i)
  • 资源路径问题(图片/配置文件的坑)
  • 跨平台打包的限制
  • 实战练习:打包之前的单位转换器

一、安装 PyInstaller

PyInstaller 是一个第三方库,打开终端(CMD 或 PowerShell)安装:

pipinstallpyinstaller

验证安装成功:

pyinstaller --version

二、最简单的打包

假设我们有一个脚本hello.py

# hello.pyprint("Hello World!")input("按回车键退出...")# 防止窗口一闪而过

在终端切换到该文件所在的目录,运行:

pyinstaller hello.py

2.1 发生了什么?

命令执行完毕后,你会发现目录下多了几个文件夹:

  1. dist/最重要。你的.exe文件就在这就(dist/hello/hello.exe)。
  2. build/:打包过程中的临时文件,可以删除。
  3. hello.spec:打包配置文件,高阶玩法才用到。
  4. __pycache__/:字节码缓存。

你可以把dist/hello这个文件夹整个拷贝给朋友,他就能运行了。


三、常用参数详解

默认打包生成的是一个文件夹(里面有一大堆依赖文件),看起来很不清爽。我们通常希望只有一个独立的.exe文件。

3.1-F:生成单文件 (One File)

pyinstaller -F hello.py

结果:在dist/下只会生成一个hello.exe。所有依赖库都被塞进了这一个文件里,非常方便分发。

3.2-w:去除黑窗口 (No Console)

如果你打包的是 GUI 程序(如 Day 31 的 Tkinter 程序),默认运行会有个黑乎乎的命令行窗口,很丑。使用-w可以隐藏它。

pyinstaller -F -w my_gui.py

3.3-i:自定义图标 (Icon)

默认的图标不好看,你可以指定自己的.ico文件。
(注意:必须是.ico格式,不能直接把.jpg改后缀,需要用工具转换)。

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

3.4-n:指定程序名 (Name)

如果不喜欢文件名作为程序名,可以用-n指定。

pyinstaller -F -n"超级工具箱"main.py

四、实战练习:打包单位转换器

让我们把Day 31写的单位转换器打包成一个独立的软件。

  1. 准备好代码文件converter.py
  2. (可选)准备一个图标文件calc.ico
  3. 打开终端,运行命令:
pyinstaller -F -w -i calc.ico converter.py
  1. 等待打包完成(看到Completed successfully字样)。
  2. 打开dist文件夹,双击converter.exe

恭喜!你现在也是能开发软件的人了!


五、进阶:资源文件的坑 (重要)

如果你的程序里读取了图片、配置文件(如open("config.json")),打包后运行很可能会报错:FileNotFoundError

5.1 原因

使用-F打包成单文件后,程序运行时会被解压到一个临时目录(通常是C:\Users\xxx\AppData\Local\Temp\_MEIxxxx)。
如果你在代码里写的是相对路径open("config.json"),程序会去那个临时目录下找,当然找不到了。

5.2 解决方案

我们需要编写一个函数,来获取资源文件的绝对路径

importsysimportosdefresource_path(relative_path):"""获取资源的绝对路径,兼容开发环境和打包后的环境"""ifhasattr(sys,'_MEIPASS'):# PyInstaller 打包后的临时目录base_path=sys._MEIPASSelse:# 开发环境的当前目录base_path=os.path.abspath(".")returnos.path.join(base_path,relative_path)# 使用方式# 错误写法: img = tk.PhotoImage(file="logo.png")# 正确写法:img_path=resource_path("logo.png")img=tk.PhotoImage(file=img_path)

打包时,还需要告诉 PyInstaller 把这些文件带上:

# 格式: --add-data "源文件;目标路径"# Windows用分号;, Mac/Linux用冒号:pyinstaller -F -w --add-data"logo.png;."script.py

六、常见问题

Q1:打包后的文件太大怎么办?

PyInstaller 会把你的环境里装的所有库都打包进去(哪怕没用到)。
最佳实践:使用虚拟环境 (Virtualenv),只安装项目需要的库,然后再打包。体积能从几百MB减小到几MB。

Q2:能在 Windows 上打包出 Mac 的 App 吗?

不能。PyInstaller不支持跨平台交叉打包

  • 要打 Windows 版 (.exe) -> 在 Windows 电脑上运行。
  • 要打 Mac 版 (.app) -> 在 Mac 电脑上运行。
  • 要打 Linux 版 -> 在 Linux 电脑上运行。

Q3:被杀毒软件误报病毒?

这是常有的事,特别是使用了-F单文件模式。
解决办法:

  1. 向杀毒软件厂商提交误报申诉。
  2. 尝试使用文件夹模式(去掉-F),通常误报率低一些。
  3. 给程序进行数字签名(需要花钱买证书)。

七、小结

PyInstaller 打包

基本命令

常用参数

常见坑

pyinstaller script.py

生成 dist/ 目录

-F (单文件 exe)

-w (无黑窗口)

-i (图标)

资源路径找不到 (sys._MEIPASS)

文件体积大 (用虚拟环境)

无法跨平台打包

关键要点

  1. -F-w是最常用的组合。
  2. 遇到资源文件丢失,记得检查路径处理逻辑。
  3. 想减小体积,请务必使用干净的虚拟环境。

八、课后作业

  1. 打包练习:将你之前写的"猜数字游戏"或"图书管理系统"打包成 exe 文件,并发给你的朋友试玩一下。
  2. 图标替换:找一张你喜欢的图片,在线转换为.ico格式,给你的程序换上新图标。
  3. 虚拟环境体验:尝试创建一个新的虚拟环境,只安装requestspyinstaller,打包一个简单的爬虫脚本,对比一下与直接在主环境中打包的体积差异。

下节预告

Day 33:日志记录 (Logging)- 程序出错了别只知道print。在生产环境中,我们需要一套专业的日志系统来记录程序的运行状态和错误信息。


系列导航

  • 上一篇:Day 31 - GUI编程入门Tkinter
  • 下一篇:Day 33 - 日志记录Logging(待更新)
版权声明: 本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若内容造成侵权/违法违规/事实不符,请联系邮箱:809451989@qq.com进行投诉反馈,一经查实,立即删除!
网站建设 2026/3/20 9:00:17

Day 39:【99天精通Python】异步编程 (AsyncIO) 上篇 - 协程的魔法

Day 39:【99天精通Python】异步编程 (AsyncIO) 上篇 - 协程的魔法 前言 欢迎来到第39天! 在前面的课程中,我们学习了多线程。线程虽然好用,但它是由操作系统负责调度的。操作系统很忙,它要在几千个线程之间来回切换&am…

作者头像 李华
网站建设 2026/3/20 15:53:13

千元出头,权限全开!实测最近卖爆的拾光坞G2到底如何!

引言时间已经来到了26年的一月中旬了,从上个月某N150型号预售到现在,熊猫依然是没看到网上有什么用户的测评,当然别人提前就说了是预售模式,所以这一点没啥喷的。在同样的配置下,N150的另一款机型因为其价格的优势最近…

作者头像 李华
网站建设 2026/3/28 8:58:33

如何查看相册访问数据?看这里!

🙋如何查看相册成员谁看过内容,喜好哪些内容,下载了哪些图片?👉支持的⬇️下面将介绍如何查看访客足迹数据:1️⃣打开土著相册小🍊序,点击目标相册,进入相册2️⃣点击底部…

作者头像 李华
网站建设 2026/3/27 13:04:56

化学研究智能体:AI架构师必须掌握的负载均衡策略

化学研究智能体规模化部署:AI架构师必学的负载均衡策略 引言:化学智能体从实验室到生产的算力瓶颈 当你花费数月时间训练出一个能预测分子性质的化学智能体,从实验室的单节点测试走向生产环境时,可能会遇到这样的场景:…

作者头像 李华