项目要求将模型导出成exe可执行文件,于是就使用pyinstaller进行打包,在打包的过程中遇到了一些问题现在在这里记录一下。(可能文章中的方法不是解决问题的正确方法,但是碰巧都给我解决了)
具体的步骤其他大佬的博客里写的挺详细的,大家想了解的话可以去看看。
python将资源文件一起打包进exe 讲解(有算例)使用pyinstaller将训练好的目标检测算法(基于pytorch)打包成一个exe文件(完整过程) 这里也给出我的环境:
windows10
python3.7.0
torch1.8.1
cuda10.1
PyInstaller4.0.0
安装:
平常我是在anaconda的虚拟环境中运行的,所以打包也用虚拟环境了。
先安装pyinstaller
pip install pyinstaller==4.0.0
安装完成后用控制台进入需要打包的页面
第一遍跑完后会生成一个.SPEC的配置文件一个build文件和dist文件。
如果显示成功的话可以在dist文件夹中找到可执行的exe文件。没有意外的话就可以用辣。
没有成功的话,可能是一些组件没有添加进去,接下来打开.SPEC文件进行配置。
主要是修改这两处,在datas中我把我训练好的权重放进去,每个文件作为一个元组类型,最终放在一个列表中,如果不是元组的话会有一个报错(ValueError: too many values to unpack)。
元组的格式是(“模型路径”,".生成的文件夹名") !!生成的路径前面有个点。最终会在dist文件夹下生成一个“.文件夹名”的文件夹。
里面就是含有我们的模型权重文件。
当然在这里改了的话,在我们的推理脚本中调用权重的路径也要进行修改。替换成相应的路径。
第二处修改的地方是hiddenimports,这里把自己写的脚本文件添加进去(比如自己写的utils),通过pip安装的会自动打包这个不用操心。
都设置好了之后。控制台执行
pyinstaller xxxxxx.SPEC
就可以生成.exe可执行文件了。
问题:
主要是出现过两个问题
1、在编译生成的过程中出现了
UnicodeDecodeError: 'utf-8' codec can't decode byte 0xd7 in position 75141:
这个和编码有关系。网上有一些解决方案。
https://blog.csdn.net/qq_35307209/article/details/80856921https://blog.csdn.net/qq_35203425/article/details/80992870 有些朋友的问题得到了解决,但是我的没有TAT…
然后看到一个大佬(找不到链接了555)说要从源头解决问题,找到他报错的那一处位置再对应的改改。我的报错显示在PyInstaller中的一个文件(具体那里也忘了…当时没有截图)。然后既然是编码的问题,我就在对应的语句后面加上了.decode(“utf-16”),这个也是一个个试的,因为水平实在是有限 …然后值得庆幸的是可以编译!(这里仅给出一种思路,因为我更改了编码之后就出现了下面的问题,猜测可能和修改了编码有关)
但是当我双击点开exe文件时,他就闪退了。仔细一看是有个错误。(这个截图了)
TypeError: compiled module 'C:\\Users\\Administrator\\Desktop\\qqqq\\dist\\github_edition_m3_onnx_yolo5\\base_library.zip\\encodings\\__init__.pyc' is not a code object
然后就去找解决方案,但是找了一圈没找到啥方法(可能是搜索的关键字有问题)。于是就尝试着把最新的pyinstaller版本降低一下,重装了4.0.0版本,然后重新生成,这次运行了还挺久。生成完成之后去文件夹一看,东西比原本多多了,一些用到的库全打包在里面,我觉得可能之前就是因为没把一些库打包进来。
然后双击.exe就可以运行了!
3、当然这里还有些小问题
这个是之前还没把运行文件里加载模型的路径给改过来。
这个是之前还没把自己写的脚本复制进来。
直接复制到"dist/你的文件名字/"里面,和exe同目录。所有的问题解决了之后再运行,就可以运行成功了…
也是不容易。
在其他机器上还没尝试过…不知道行不行。
4.10更新
尝试过了,同样的python环境、CUDA版本、PyTorch版本下能直接运行。
4.13更新
新加了PyQt5之后,重新编译过后发现无法编译,报以下错误。
flag, ord(typcd), nm + pad))
struct.error: argument out of range
百度/Google了一下是编译过后文件过大的问题??
https://github.com/pyinstaller/pyinstaller/issues/4495 看了大佬们的解决方案,加了–clean好像也没啥用。
(ten3) C:\Users\Administrator\Desktop\qqqq>pyinstaller --clean -F qt_m3_onnx_yolo5.py
根据大佬们另外的说法,说是大文件不要用-F命令,于是采用以下命令
pyinstaller --clean qt_m3_onnx_yolo5.py
之后,编译成功!