如何将含MySQL与本地图片的Python代码打包为真正独立的EXE?
把Python项目打包成完全独立EXE的实操步骤
你遇到的问题分三个核心:本地图片找不到、其他电脑没MySQL服务器、没有MySQL数据,一个个解决:
一、搞定本地图片的打包问题
打包成--onefile后,PyInstaller会把所有文件解压到临时文件夹,原来的本地路径就失效了,要这么改:
- 把所有用到的
.png图片移到和你的主Python脚本(比如main.py)同一个文件夹里。 - 修改代码里加载图片的部分:
先在代码开头导入sys和os模块:
然后把原来加载图片的代码,替换成下面的逻辑(比如你原来的图片叫import sys import os import tkinter as tklogo.png):# 获取资源路径:如果是打包后的EXE,用临时目录;否则用当前文件夹 def get_resource_path(relative_path): try: # PyInstaller打包后会自动设置这个变量 base_path = sys._MEIPASS except Exception: base_path = os.path.abspath(".") return os.path.join(base_path, relative_path) # 加载图片 img = tk.PhotoImage(file=get_resource_path("logo.png")) - 打包时告诉PyInstaller把图片加进去,用
--add-data参数(Windows系统用分号分隔路径):
如果有多个图片,直接写pyinstaller --onefile --add-data "logo.png;." main.py*.png;.,比如--add-data "*.png;."
二、解决MySQL依赖的问题(新手首选换SQLite)
其他电脑没装MySQL服务器,没法连接你的数据库,最省心的办法是把MySQL换成SQLite——这是个文件型数据库,不需要服务器,直接把数据库文件打包进EXE就行:
- 把你MySQL里的数据导出成SQLite数据库文件(比如
mydata.db):- 可以用Navicat、DBeaver这类数据库工具,直接把MySQL的数据迁移到SQLite;
- 或者手动把MySQL的表结构和数据转换成SQLite的SQL语句,执行后生成
.db文件。
- 修改代码里的数据库连接部分,替换掉
mysql.connector:
原来的MySQL连接代码大概是这样:
换成SQLite的连接(Python自带import mysql.connector conn = mysql.connector.connect(host="localhost", user="xxx", password="xxx", database="xxx")sqlite3模块,不用额外安装):import sqlite3 # 同样用上面的get_resource_path函数获取数据库文件路径 db_path = get_resource_path("mydata.db") conn = sqlite3.connect(db_path) - 把
mydata.db也放到主脚本文件夹,打包时用--add-data加进去:pyinstaller --onefile --add-data "*.png;." --add-data "mydata.db;." main.py
三、确保customtkinter等模块被正确打包
customtkinter这类第三方模块有时候会被PyInstaller漏掉,打包时加上--collect-all customtkinter参数,确保它的所有资源都被打包:
最终的完整打包命令(Windows):
pyinstaller --onefile --collect-all customtkinter --add-data "*.png;." --add-data "mydata.db;." main.py
最后验证
打包完成后,把生成的EXE从dist文件夹里单独拿出来,放到其他没有Python、MySQL的电脑上测试,应该就能正常运行了。
内容的提问来源于stack exchange,提问作者Mohamed Junaid Samiullah
相关产品推荐
相关产品推荐

