今天有同学问打包Python程序的事情,那这里写篇文章整理下。以下是PyInstaller打包Python程序的步骤第一步:安装PyInstaller操作耗时:1分钟

核心命令:

代码语言:javascript复制

pip install pyinstaller

安装完成后,输入 pyinstaller --version 验证是否成功。如果遇到网络问题,可尝试切换国内镜像源(如清华源)

第二步:基础打包——从Hello World开始适用场景:简单脚本、命令行工具

操作步骤:

创建一个测试脚本 hello.py,内容如下:

代码语言:javascript复制

print("Hello, 我是被PyInstaller打包的EXE!")

input("按回车键退出...")

在脚本目录打开命令行,执行:

代码语言:javascript复制

pyinstaller --onefile hello.py

--onefile:将所有内容打包成单个EXE文件,方便分发。生成的EXE文件位于 dist 文件夹中,双击即可运行

进阶选项:

隐藏黑窗口:GUI程序(如PyQt/Tkinter)可加 --noconsole,避免弹出命令行窗口

自定义图标:使用 --icon=app.ico 指定EXE图标(需ICO格式)

第三步:处理复杂项目——资源文件与依赖项常见痛点:图片加载失败、配置文件丢失、第三方库未识别

解决方案:

添加资源文件

若代码中引用了图片、音频等文件,需通过 --add-data 手动打包:

代码语言:javascript复制

pyinstaller --add-data "images/*.png;images" --add-data "config.ini;." app.py

格式为 源路径;目标路径(Windows用分号 ;,Linux/macOS用冒号 :)

代码中需动态获取资源路径(见下文调试技巧)。强制引入隐藏依赖

某些库(如动态导入的模块)可能未被自动检测,需通过 --hidden-import 声明:

代码语言:javascript复制

pyinstaller --hidden-import=pandas --hidden-import=sklearn model.py

第四步:高级配置——使用.spec文件定制化打包适用场景:多文件项目、重复打包、复杂依赖

操作流程:

生成初始配置文件:

代码语言:javascript复制

pyi-makespec --onefile app.py

编辑 app.spec 文件,关键参数示例:

代码语言:javascript复制

a = Analysis(

['app.py'],

datas=[('assets/*.png', 'assets')], # 添加资源文件夹

hiddenimports=['numpy'], # 强制引入依赖

...

)

exe = EXE(

...,

icon='app.ico', # 指定图标

console=False# 隐藏控制台

)

根据 .spec 文件重新打包:

代码语言:javascript复制

pyinstaller app.spec

代码语言:javascript复制第五步:体积优化——让EXE文件更小巧痛点:默认打包的EXE文件动辄几十MB,如何压缩?

实战技巧:

使用UPX压缩

(可减少30%-50%体积):

下载UPX工具并配置环境变量,打包时添加参数:

pyinstaller --onefile --upx-dir=C:\upx app.py 剔除无用库

代码语言:javascript复制pyinstaller --exclude-module=matplotlib --exclude-module=scipy app.py

启用虚拟环境

:在纯净的虚拟环境中打包,避免引入冗余依赖

第六步:调试与测试——解决打包后闪退问题常见错误:文件路径错误、DLL缺失、兼容性问题

排查方法:

保留控制台查看报错

:去掉 --noconsole 参数,运行EXE时观察错误信息。

动态路径处理

:在代码中兼容打包后的资源路径:

代码语言:javascript复制

import sys, os

ifgetattr(sys, 'frozen', False):

base_path = sys._MEIPASS # 打包后的临时资源目录

else:

base_path = os.path.dirname(__file__)

image_path = os.path.join(base_path, 'assets/logo.png')

跨平台测试

:在不同Windows版本(如Win10/Win11)及位数(32/64位)环境中验证兼容性

第七步:终极指南——常见问题一站式解决EXE文件被杀毒软件误报原因:PyInstaller生成的启动器可能被误判为病毒。方案:向杀软添加信任,或购买代码签名证书

打包后启动速度慢原因:单文件模式需解压临时文件。优化:改用目录模式,或使用UPX压缩

依赖库版本冲突方案:在 requirements.txt 中固定版本号,确保打包环境与开发环境一致