注:当我们用python写好一个完整的程序以后想要把这个py主程序运行到没有安装python的windows时,我们就要用到pyinstaller这个第三方库用来把这些程序打包成exe的可执行文件方便其他人使用你的程序,以下是一个完整的流程
一、项目结构(必须这样放,否则打包必错)
你先建一个文件夹,比如叫 MyApp ,所有东西都放这里。
plaintext
MyApp/
├── main.py # 主程序入口
├── icon.ico # 程序图标(Windows)
├── config.json # 配置文件用于嵌套什么的
├── settings.ini # 配置文件一般是很简单的配置有时我们一般人都可以直接改这两是不同的东西
├── assets/ # 资源文件夹(图片、音频、数据、字体)
│ ├── images/ # 图片
│ ├── sounds/ # 音频
│ ├── data/ # 数据文件(csv、txt、xlsx)
│ └── fonts/ # 字体
├── src/ # 你自己写的模块
│ ├── utils.py #(用于处理时间加密的)
│ ├── api.py #(接口文件)
│ └── ui.py #(用户界面的布局)
└── libs/ # 第三方库/自己封装的库
二、代码里必须写的路径函数(打包后不丢资源)
把这段代码放到 main.py 最前面,所有资源都用这个函数读取:
python
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)
例子:
img = resource_path("assets/images/logo.png")
config = resource_path("config.json")
data = resource_path("assets/data/data.csv")
三、打包前必须做的环境准备(必做)
- 打开命令行,进入项目文件夹
cd D:\MyApp #(切换到对应目录)
- 创建虚拟环境(避免打包体积大、报错)
python -m venv venv
其实不创建也可以,就是感觉容易冲突出问题。
- 激活虚拟环境
venv\Scripts\activate
- 安装项目需要的库(只装你用到的)
pip install 你需要的库 #(这个能懂吧)
- 安装 PyInstaller(这就是打包的第三方库)
pip install pyinstaller
四、最完整打包命令(包含所有文件、资源、模块、图标)
下面这条命令是万能终极版,包含所有你需要的功能,直接复制运行:
pyinstaller -F -w --clean --noconfirm -i icon.ico --add-data "assets;assets" --add-data "config.json;." --add-data "settings.ini;." --add-data "src;src" --add-data "libs;libs" main.py
这个前提是每个文件都放在其对应的位置,必须严格放置。
五、命令每一部分详细解释(你必须懂)
我把上面的命令拆解开,每一段都告诉你是什么、干什么、为什么要加:
- pyinstaller
- 作用:启动打包工具
- 必须写在最前面
-F
- 全称: --onefile
- 作用:打包成单个 exe 文件
- 不加的话会生成一个文件夹,里面一堆文件
- 必须加,最常用
-w
- 全称: --windowed / --noconsole
- 作用:不显示黑色控制台窗口
- 适合 GUI 程序、桌面软件
- 如果你是命令行程序,就不要加 -w ,用 -c
--clean
- 作用:打包前自动清理旧缓存、旧文件
- 避免旧文件干扰导致打包失败
- 每次打包都建议加
--noconfirm
- 作用:打包时不询问是否覆盖,直接覆盖
- 避免重复打包时弹确认框
-i icon.ico
- 作用:设置程序图标
- 必须是 .ico 格式
- 放在项目根目录
- --add-data "assets;assets"
- 作用:把 assets 文件夹打包进 exe
- 格式: 源路径;目标路径
- Windows 用分号 ; ,Mac/Linux 用冒号 :
- 不加这个,打包后图片、音频、数据都会丢失
--add-data "config.json;."
- 作用:把 config.json 打包到 exe 同目录
- . 表示 exe 所在目录
--add-data "settings.ini;."
- 作用:把 settings.ini 打包到 exe 同目录
--add-data "src;src"
- 作用:把你自己写的 src 模块文件夹打包进去
- 不加会导致 import src.utils 报错
--add-data "libs;libs"
- 作用:把 libs 文件夹打包进去
- 如果你有自己的库文件,必须加
main.py
- 作用:指定主程序入口文件
- 必须是你项目的启动文件
六、如果打包后提示“找不到模块”,加这个参数
--hidden-import=模块名
实例
pyinstaller -F --hidden-import=requests --hidden-import=urllib3 --hidden-import=pandas._libs.tslibs.base main.py
七、打包后文件在哪里?
打包完成后,在 MyApp 文件夹里:
- dist/main.exe → 最终可执行文件
- build/ → 临时文件,可删除
- main.spec → 配置文件,不用管
- 反正找exe文件就对了
八、最常见问题怎么解决
- 打包后闪退
把 -w 换成 -c ,看报错:
pyinstaller -F -c main.py
- 打包后找不到资源
必须加 --add-data ,并且代码用 resource_path
- 打包后 exe 很大(我自己一般不管,因为自己用懒得配虚拟环境了,个人感觉问题也不大)
用虚拟环境,只装必要库
- 打包后报毒
这个是正常的,因为是自己写的软件,现在软件基本上要搞数字签名才不会包病毒,如果觉得烦可以去研究一下
- 打包后功能不全
检查是否漏了 --add-data 或 --hidden-import
九、以下是一些常用的模板吧,对应打命令就行
- 最常用(单文件 + 无黑窗 + 图标 + 资源)
pyinstaller -F -w --clean -i icon.ico --add-data "assets;assets" main.py
- 调试用(单文件 + 显示黑窗 + 看报错)
pyinstaller -F -c --clean main.py
- 完整项目(包含所有文件、模块、配置)
pyinstaller -F -w --clean --noconfirm -i icon.ico --add-data "assets;assets" --add-data "config.json;." --add-data "src;src" main.py
总结:大致的方法就是这样,因为打包还是要根据你自己写的具体情况来分析,如果你是严格按照规定来的大概率没有问题,但是,你如果写的是屎山,那你就得自己研究了,反正方法大差不差,我就只能提供个思路。代码是死的,人是活的嘛,只要能达到目的一切都好,哪怕写的是屎山。








Comments | NOTHING