最近老师让我将课题内的一个模块写成软件,方便后续使用。鉴于课题组传统,准备使用qt designer做Ui设计,通过Qt Uic转换成py文件再去写内部逻辑,最后用pyinstaller打包成.exe软件。在这过程中,在最后一步打包为软件遇到了巨大问题,部分功能始终无法使用。在经过两天努力,终于解决了问题。因此记录分享一下。也顺便分享一下本软件的制作过程。
本项目主要内容是将深度学习训练出的模型嵌入到.exe软件使用。
1.qt designer进行UI设计
简单分享一下软件的部分页面,最终效果就是用户输入数据,通过深度学习模型输出结果。内部逻辑就不过多赘述。
2.将py文件打包为.exe文件
在这个过程中,涉及到模型的加载,一些数组的加载和副窗口的联动。在python中,运行时功能一切正常,但是通过pyinstaller打包为.exe运行后,预测功能无法实现。查阅资料发现是模型等资源没有被正确的加载进去。首先去修改了py文件中的模型加载路径等。
def load_resources(self):
try:
# 确定 base_path
if getattr(sys, 'frozen', False):
base_path = sys._MEIPASS
else:
base_path = r'D:\pythonlearning\IT'
# 定义文件路径
self.single_model_path = os.path.join(base_path, 'forward_model_1725180986.0.h5')
self.double_model_path = os.path.join(base_path, 'model_1725206208.0.h5')
except Exception as e:
print(f"An error occurred while loading resources: {e}")
这是其中部分的加载方法,用相对路径的方法去动态加载,防止出现找不到路径的问题。
改完以后发现还是不行,继续查阅资料,发现说是模型文件没有打包到.exe中,有两种方法,
1 是命令行--add-data的方式
pyinstaller --onefile -w --add-data "D:\pythonlearning\IT\forward_model_1725180986.0.h5;." D:\pythonlearning\IT\Mainwindow.py
2 是在.spec文件中的data中添加 ,如下
a = Analysis(
['Mainwindow.py'],
pathex=[],
binaries=[],
datas=[
('D:\\pythonlearning\\练习\\pyqt\\惯性管设计\\forward_model_1725180986.0.h5', '.'),
.......
.......
],
......
添加完以后,运行pyinstaller Mainwindow.spec指令,重新打包。注意,一定要在你项目所在的目录去运行这个命令,或者使用项目的绝对地址
在整完这些后,运行项目,发现还不行。又去查阅,说要将资源文件一起放到项目文件中,于是将资源文件一起挪到了dist目录下
再次运行,还是不行。于是在代码中添加了一些调试信息,在运行时看看资源导读有没有被加载 指令如下:pyinstaller --debug all Mainwindow.spec
再运行,发现显示临时目录里找不到模型等信息。临时目录是软件运行时系统默认分配的一个文件夹,所有的资源文件要添加到临时目录里才可以让软件加载。查阅后发现可以更改临时目录,于是在Mainwindow.spec中修改了默认的临时目录位置,dist是打包软件时自动生成的一个文件夹,生成的.exe会放在这个目录下。如下
runtime_tmpdir='D:/pythonlearning/IT/dist',
将资源全放到里面,再运行,成功了
总结,在使用pyinstaller打包软件时我就知道加载资源的路径一定要正确,为此,我将几个需要的资源都放在了同一个目录下,使用动态路径加载的方式,为的就是让软件能找到资源,没想到临时目录在Cpan某个犄角旮旯里,费了这么大劲总算找出问题解决了,记录分享一下