pyinstaller实现将python程序打包成EXE的执行文件
PyInstaller 是一个流行的 Python 打包工具,它能够将 Python 应用程序及其所有依赖项打包成单个可执行文件,支持 Windows、Linux 和 macOS 等多个平台。PyInstaller 的主要优势在于它的简单易用和跨平台特性,使得开发者可以轻松地将 Python 项目分发给最终用户,而无需让他们安装 Python 解释器或任何依赖库。
# 基础打包(生成文件夹)
pyinstaller your_script.py
会在当前目录下生成两个文件夹:
-
build/
:包含临时文件和日志 -
dist/
:包含生成的可执行文件单文件打包 (--onefile 参数)
--onefile 是 PyInstaller 最常用的参数之一,它可以将所有依赖项打包到一个单独的可执行文件中:pyinstaller --onefile your_script.py
使用 --onefile 参数后,dist/ 目录下将只生成一个可执行文件,便于分发。不过需要注意:单文件打包会增加程序的启动时间,因为所有依赖项需要先解压到临时目录
生成的单个文件比多文件版本稍大
某些防病毒软件可能会误报单文件打包的程序
PyInstaller 提供了许多有用的参数来定制打包过程:
--noconsole:不显示控制台窗口(适用于 GUI 程序)
--icon=app.ico:为可执行文件设置图标
--name:设置生成的可执行文件名称
--add-data:添加非 Python 文件(如图片、配置文件等)
--hidden-import:显式包含未自动检测到的模块
# 打包成单个exe文件
pyinstaller -F your_script.py
# 无控制台窗口的程序
pyinstaller -F -w your_script.py
# 添加程序图标
pyinstaller -F -w -i app.ico your_script.py
# 指定输出目录
pyinstaller -F --distpath .
/output
your_script.py
# 排除不需要的模块(减小文件大小)
pyinstaller -F --exclude-module matplotlib your_script.py
# 添加加密密钥
pyinstaller -F --key=yourpassword your_script.py
(1)多文件打包
Pyinstaller -D 【项目绝对路径】
(2)单文件打包
Pyinstaller -F 【项目绝对路径】
Pyinstaller -F D:\code\yunwei\demo_1\lesson08_01.py
遇到的问题:
打包后程序无法运行
可能原因:
缺少依赖项:使用 --hidden-import 参数添加
路径问题:使用 sys._MEIPASS 访问打包后的资源
防病毒软件拦截:尝试添加白名单
2 文件大小过大
解决方案:
使用 UPX 压缩
排除不必要的模块
使用虚拟环境减少依赖项
3 处理数据文件
如果需要包含非 Python 文件(如图片、配置文件等),可以使用 --add-data 参数:
pyinstaller --add-data="data.txt;." your_script.py
在代码中,使用以下方式访问这些文件:
import sys
import os
def resource_path(relative_path):
""" 获取资源的绝对路径 """
if hasattr(sys, '_MEIPASS'):
return os.path.join(sys._MEIPASS, relative_path)
return os.path.join(os.path.abspath("."), relative_path)
# 使用示例
data_path = resource_path('data.txt')
、最佳实践
使用虚拟环境:在干净的虚拟环境中打包,避免包含不必要的依赖
测试打包结果:在不同的机器上测试打包后的程序
版本控制:将 spec 文件纳入版本控制
分阶段调试:先不使用 --onefile 打包,调试成功后再尝试单文件打包
日志记录:在程序中添加日志功能,便于诊断打包后的问题
总结
PyInstaller 是一个功能强大且灵活的 Python 打包工具,通过本文的介绍,你应该已经掌握了:
基本的 pyinstaller --onefile xxx.py 打包方法
如何使用和修改 xxx.spec 文件进行高级配置
Windows 平台特定的控制台窗口控制技巧
教学:
https://link.zhihu.com/?target=https%3A//www.bilibili.com/video/BV1P24y1o7FY%3Fp%3D5
参考:https://blog.csdn.net/qq_48979387/article/details/132359366