PyInstaller打包PySimpleGUI GUI程序报错FileNotFoundError:文件或目录不存在
解决PyInstaller打包后找不到模型文件的问题
问题根源
你代码里用了mymodels/model1.h5这类相对路径,但PyInstaller打包后,程序运行时的工作目录和开发环境完全不同,且模型文件不会自动被纳入包中,导致运行时触发FileNotFoundError。
具体解决步骤
1. 让PyInstaller打包模型文件
你需要明确告诉PyInstaller要把mymodels文件夹里的文件一起打包,有两种方式:
命令行参数直接指定
Windows平台执行:pyinstaller --add-data "mymodels/*;mymodels/" your_script.pyMac/Linux平台执行:
pyinstaller --add-data "mymodels/*:mymodels/" your_script.py(注:Windows用
;分隔源路径和目标路径,Mac/Linux用:)通过.spec文件配置
先生成.spec文件:pyinstaller your_script.py,然后打开生成的.spec文件,修改datas字段:datas=[('mymodels/*.h5', 'mymodels'), ('mymodels/*.joblib', 'mymodels')],再用
pyinstaller your_script.spec重新打包。
2. 修改代码中的路径获取逻辑
打包后程序会在临时目录运行,必须动态获取文件的实际路径,替换原来的硬编码相对路径:
import os import sys import PySimpleGUI as sg import keras import joblib 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) window = sg.Window('Loading please wait...', layout, resizable=False, size=(400, 100), finalize=True) # 用动态路径加载模型 model1 = keras.models.load_model(get_resource_path('mymodels/model1.h5')) model2 = joblib.load(get_resource_path("mymodels/model2.joblib")) model3 = joblib.load(get_resource_path("mymodels/model3.joblib")) window.close()
3. 额外注意事项
- 确认
mymodels文件夹的层级结构和代码中的路径完全匹配 - 如果用
-F参数打包成单文件,上述get_resource_path函数依然能正确获取临时解压目录的路径 - Mac平台打包完成后,若遇到权限问题,可执行
chmod +x your_executable赋予可执行权限
内容的提问来源于stack exchange,提问作者file_csv
相关产品推荐
相关产品推荐

