pyinstaller是将python脚本打包为windows可执行文件最稳定成熟的工具,需在激活的虚拟环境中运行,注意资源路径处理与--add-data参数配置。

Python 代码用 PyInstaller 打包成 exe 最稳
VS Code 本身不提供打包功能,它只是编辑器;真正把 python 脚本变成 .exe 的是外部工具,目前最成熟、兼容性最好、踩坑最少的是 PyInstaller。
它能自动收集依赖、处理 import、嵌入 Python 解释器,生成单文件或目录形式的可执行程序。Windows 上双击就能运行,不用装 Python 环境。
- 必须在项目所在目录的终端里运行打包命令,否则
PyInstaller找不到模块路径 - 如果用了
venv,务必先激活虚拟环境再安装和运行PyInstaller,否则打包进去的是系统 Python 的包,容易漏依赖 - 带图标、控制台开关、单文件模式这些都靠命令行参数控制,不是 VS Code 设置项
常见报错:Failed to execute script 或启动就闪退
这不是打包失败,而是运行时出问题——90% 是因为相对路径、资源文件(如图片、配置文件)、或者没正确处理 sys._MEIPASS。
PyInstaller 把资源打进去后,运行时实际解压到临时目录,__file__ 指向的不再是源码位置。硬写 ./config.json 肯定找不到。
- 用
getattr(sys, '_MEIPASS', os.path.dirname(os.path.abspath(__file__)))动态获取资源根路径 - 图片、字体、JSON 这类非 Python 文件,必须加
--add-data参数显式声明,比如:pyinstaller --add-data "assets;assets" main.py(Windows 分号分隔) - 加
--console(默认)先看报错信息,别急着加--noconsole,否则错误直接吞掉
打包命令怎么选:单文件 vs 目录模式
区别不在体积,而在运行逻辑和调试成本。
单文件(--onefile)启动慢一点,因为每次都要解压到临时目录;目录模式(默认)更快启动,但会生成一堆文件和文件夹,看着乱。
- 开发调试阶段用目录模式(不加
--onefile),方便查dist/下缺了啥文件 - 交付给别人用,优先选
--onefile --noconsole --icon=app.ico,干净利落 -
--onefile下无法用os.chdir()切到“当前目录”,因为那个“当前”是临时路径,改了也没意义
VS Code 里怎么快速触发打包?配个 task 就行
不用每次都切终端敲命令,把常用打包指令写进 .vscode/tasks.json,按 Ctrl+Shift+P → “Tasks: Run Task” 就能选。
示例(Windows):
{
"version": "2.0.0",
"tasks": [
{
"label": "pyinstaller one-file no-console",
"type": "shell",
"command": "pyinstaller --onefile --noconsole --icon=icon.ico ${file}",
"group": "build",
"presentation": {
"echo": true,
"reveal": "always",
"focus": false
}
}
]
}
-
${file}自动代入当前打开的 Python 文件,不用手输名字 - 图标文件
icon.ico必须放在工作区根目录,否则路径要写全 - 如果提示
command 'pyinstaller' not found,说明没激活 venv 或没全局安装,别改 task,先解决环境问题
打包本质是环境 + 路径 + 资源路径三者对齐,不是点一下按钮的事。最常卡住的地方,永远是“我以为它在读这个路径”,其实它在读另一个临时路径。










