2、PyInstaller入门:从安装到第一次打包
说实话,我刚开始接触Python打包时,也踩过不少坑。那时候写了个小工具给同事用,结果对方电脑上没装Python,场面一度很尴尬。后来发现了PyInstaller,才算是真正解决了「分发难」的问题。
这一章,咱们就从零开始,把PyInstaller玩明白。你不需要有任何打包经验,跟着我一步步来就行。
2.1 PyInstaller是什么?
PyInstaller,说白了就是一个能把Python脚本「变成」独立可执行文件的工具。它会分析你的代码,把Python解释器、你用的第三方库、以及所有依赖的资源文件,统统打包到一起。
最终产出的那个exe(或app),拿到任何同系统的电脑上都能直接跑。对方不需要装Python,也不需要装任何依赖。
核心原理一句话:PyInstaller把你的Python脚本和它需要的所有东西,塞进一个「自包含」的包里。运行时,它会临时解压出一个微型Python环境来执行你的代码。
2.2 安装PyInstaller
安装非常简单,一行命令搞定。我个人习惯用pip来装:
pip install pyinstaller
如果你用的是Python 3,可能需要用pip3:
pip3 install pyinstaller
嗯,这里要注意一点——建议在虚拟环境里安装。我在项目中遇到过好几次,因为全局环境太乱,导致打包出来的文件莫名其妙地大。虚拟环境能帮你隔离依赖,打包更干净。
验证是否安装成功:
pyinstaller --version
如果能看到版本号,比如 6.x.x,那就说明装好了。
小技巧:如果你在公司内网或网络不好,可以试试用清华镜像源:pip install pyinstaller -i https://pypi.tuna.tsinghua.edu.cn/simple
2.3 基本打包命令
先准备一个最简单的Python脚本,就叫 hello.py:
# hello.py
print("Hello, 跨平台打包!")
input("按回车键退出...")
然后打开终端,进入脚本所在目录,执行:
pyinstaller hello.py
就这么简单。你会看到终端里刷刷刷地跑一堆日志,大概几十秒后,打包完成。
你想想看,是不是比想象中容易?但别急,真正的门道在后面。
2.4 理解打包产物:dist与build目录
打包完成后,你会发现当前目录下多了两个文件夹:dist 和 build。还有一个 hello.spec 文件。
我第一次看到这三个东西时,也有点懵。咱们一个一个说清楚。
2.4.1 dist目录——你真正要交付的东西
dist 是 distribution(分发)的缩写。这里面放的就是最终的可执行文件。打开看看,你会找到一个 hello 文件夹(Windows下是 hello.exe 加上一堆dll文件)。
双击运行 hello.exe,就能看到控制台输出那句「Hello, 跨平台打包!」。
记住:dist目录里的东西,就是你要发给用户的。其他目录都可以删掉,唯独这个不能丢。
2.4.2 build目录——打包过程中的临时文件
build 目录是打包过程中产生的临时文件。PyInstaller会把分析结果、中间产物都扔在这里。
这个目录对用户来说完全没用。我一般打包完就直接删掉它。不过调试时偶尔会进去看看日志,排查问题。
注意:build目录可以随时删除。下次打包时,PyInstaller会自动重新生成。但如果你删了dist目录,那打包产物就没了,得重新打包。
2.4.3 spec文件——打包的「配置文件」
hello.spec 是一个文本文件,记录了打包时的所有配置。包括:
- 入口脚本路径
- 需要包含哪些数据文件
- 是否隐藏控制台窗口
- 图标路径
- 等等
你可以直接编辑这个文件,然后运行:
pyinstaller hello.spec
这样就能复用之前的配置,不用每次都敲一堆参数。我个人习惯把复杂的打包配置都写在spec文件里,方便维护。
2.5 常用打包参数一览
刚才那个是最基础的打包命令。实际项目中,我们通常会加一些参数。我整理了一个表格,方便你查阅:
| 参数 | 作用 | 示例 |
|---|---|---|
-F |
打包成单个exe文件 | pyinstaller -F hello.py |
-D |
打包成文件夹(默认模式) | pyinstaller -D hello.py |
-w |
隐藏控制台窗口(GUI程序用) | pyinstaller -w myapp.py |
-i |
指定exe图标 | pyinstaller -i icon.ico hello.py |
--name |
指定输出文件名 | pyinstaller --name "我的工具" hello.py |
--add-data |
添加额外数据文件 | pyinstaller --add-data "data.txt;." hello.py |
我的建议:刚开始学,先用默认的文件夹模式(-D)。单文件模式(-F)虽然看起来清爽,但启动速度会慢一些,而且有时候会触发杀毒软件误报。我在项目中吃过这个亏,后来就改用文件夹模式了。
2.6 实战:打包一个带依赖的脚本
光打印一句话太简单了。咱们来点实际的——打包一个用到了第三方库的脚本。
假设我们写一个 qr_gen.py,用 qrcode 库生成二维码:
# qr_gen.py
import qrcode
data = "https://example.com"
img = qrcode.make(data)
img.save("qrcode.png")
print("二维码已生成!")
input("按回车键退出...")
先安装依赖:
pip install qrcode[pil]
然后打包:
pyinstaller -F qr_gen.py
打包完成后,在 dist 目录下找到 qr_gen.exe,双击运行。你会发现它成功生成了二维码图片。
你看,第三方库也被自动打包进去了。这就是PyInstaller的厉害之处——它会自动分析你的import语句,把需要的库都带上。
曾经踩过的坑:有些库用了动态加载(比如通过 __import__ 或 importlib 导入),PyInstaller可能分析不到。这时候就需要手动在spec文件里指定了。后面章节我会详细讲怎么处理这种情况。
2.7 本章小结
到这,你已经掌握了PyInstaller的核心用法:
- 安装:
pip install pyinstaller - 基本打包:
pyinstaller 你的脚本.py - 理解产物:dist是交付物,build是临时文件,spec是配置文件
- 常用参数:-F单文件、-w隐藏控制台、-i设置图标
说实话,入门就是这么简单。但别高兴太早——实际项目中的打包,远比这个复杂。比如怎么处理资源文件、怎么配置图标、怎么避免杀毒软件误报……这些才是真正的硬骨头。
下一章,咱们就深入聊聊这些「进阶」话题。你准备好了吗?