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设置图标

说实话,入门就是这么简单。但别高兴太早——实际项目中的打包,远比这个复杂。比如怎么处理资源文件、怎么配置图标、怎么避免杀毒软件误报……这些才是真正的硬骨头。

下一章,咱们就深入聊聊这些「进阶」话题。你准备好了吗?