py文件打包为exe可执行文件,涉及mysql连接失败以及找不到json文件
py文件打包为exe可执行文件,涉及mysql连接失败以及找不到json文件
项目场景:使用flask框架封装算法接口,并使用pyinstaller打包为exe文件。使用pyinstaller打包多文件的场景,需要自己手动去.spec
文件中添加其他文件,推荐使用auto-py-to-exe
,有可视化界面,比较方便,直接添加文件就行。
问题描述
问题1、算法本地运行,使用postman传参,mysql能够连接数据库成功。当打包成exe文件后,exe文件运行失败。
问题2、json文件已经包含在打包文件中,还是提示找不到。
错误显示:
1、mysql连接失败,提示mysql.connector出现问题。
2、找不到json对应的文件路径
原因分析:
问题1、远程连接mysql库时,使用mysql-connector-python库,这个库可能与pyinstaller不兼容,导致连接频繁失败,找了一些相关的文章没有涉及,记录一下。
问题2、因为程序在运行时未能正确定位文件路径 ,即使文件被打包到了输出目录中,程序运行时的工作目录(os.getcwd())可能与你预期的不同。
例如:
在开发环境中,工作目录通常是脚本所在的目录。
在打包后的程序中,工作目录可能是用户启动程序的目录(如桌面或其他位置),而不是可执行文件所在的目录。
解决方案:
问题1解决方法:
使用纯 Python 实现的驱动程序:PyMySQL
pip install PyMySQL
然后在python中导入pymysql
import pymysql
这样可以避免 mysql.connector 中的复杂依赖问题。
问题2解决方法:
使用 sys._MEIPASS
或 os.path.dirname(sys.executable)
获取程序的真实路径。
import os
import sysdef get_resource_path(relative_path):"""获取资源文件的绝对路径"""if hasattr(sys, '_MEIPASS'):# PyInstaller 生成的临时目录base_path = sys._MEIPASSelse:# 开发环境下的路径base_path = os.path.dirname(os.path.abspath(__file__))return os.path.join(base_path, relative_path)# 示例:读取 JSON 文件
def read_from_json(path):full_path = get_resource_path(path)if not os.path.exists(full_path):raise FileNotFoundError(f"File not found: {full_path}")with open(full_path, 'r', encoding='utf-8') as file:return file.read()
在代码中调用 read_from_json("all_data_update.json")
时,get_resource_path
会自动处理路径问题。
关于auto-py-to-exe使用
安装和运行:
pip install auto-py-to-exe
auto-py-to-exe
可视化界面: