赞
踩
# pyinstaller 安装
pip install pyinstaller # 安装最新版本的pyinstaller指令
# 在dist目录下只生成一个较大xxx.exe文件,所有依赖库全打包到exe中,打包后的exe可单独使用
pyinstaller -F xxx.py
# 在dist目录下生成较小的exe文件,其他依赖库全都在dist文件夹下,打包后的exe不可单独使用
pyinstaller -D xxx.py
# 选择exe图标机进行打包
pyinstaller -i icon.ico -F temp.py
# 其他pyinstaller 指令 查询P
pyinstaller -h
pyisntaller -F detect.py
打包后报错,问题: no moudel ‘xxxx’
解决办法 : 在打包之前用pip install xxxx安装好这个依赖库
pyisntaller -F detect.py
打包后报错,问题: No such file or directory: ‘C:\Users\qhcsu\AppData\Local\Temp\_MEI106802\utils\general.py
解决办法:创建一个hook-utils.py文件(其他也一样,报错的是_MEI106802\xxx\yyym,就文件名为hook-xxx.py)
文件内容为:
from PyInstaller.utils.hooks import collect_data_files
datas = collect_data_files(“utils”)
将hook-utils.py放入你的虚拟环境中Pyinstaller文件下的hooks文件中,如下图所示
pyinstaller打包过程中不会打包子目录下其他文件夹的内容,只有将需要打包的文件夹加入到hooks中才能被打包
pyisntaller -F detect.py
报错问题:yolov5l.pt权重文件与data目录下的yaml配置文件没有被打包进exe文件
解决方案:
在pyinstaller生成的detect.desc配置文件中有一项datas=[],如下图所示:
将文件夹的名字data手动写入datas中,datas =[('data','data'),('yolov5l.pt','yolov5l')]
()中第一项是需要打包的文件,第二项是打包后该文件的名字
到这里出现了一个奇怪的问题,项目目录如下,yolov5.pt
在一级目录下,理应被直接打包进exe
,我第一次尝试时成功了,运行detec.exe
不用Download yolov5l.pt
,说明权重文件打包成功了,但后续遇到其他问题的时候,用上述配置文件重新打包后调用detect.exe
却要重新下载,这就让我很不理解,于是我将yolov5l.pt
也放入了data
目录文件下,并将detect.py
文件中--weight
参数的默认路径设置为./data/yolov5l.pt
再使用pyinstaller打包
就解决了这个问题.
4.到这里其实基本上整个pyinstaller打包的任务就完成了,但是还有一个问题
问题: 打包后的detect.exe文件3.45GB,过大且运行过慢,
解决方法: 考虑虚拟环境中有一些其他不必要的依赖库也被打包进exe文件中,
因此,我们在使用pyinstaller打包文件时必须先用conda activate create -n torch python=3.7
创建一个新的虚拟环境,pip install -r requirements.txt
再用pyinstaller打包就会减少一个文件冗余
5.因为重新安装了一个新的虚拟环境,环境中opencv库的版本更新了
问题:pyisntaller打包opencv-python库出错
我刚开始以为opencv安装掉了,回去查看发现opencv已经安装成功,重复几次后发现还是opencv库的
打包还是存在问题,然后我去对比之前安装opencv库与新建的opencv库,发现版本不一样,后来就去
网上搜,发现pyinstaller的版本需要与opencv版本匹配才能成功打包。
project
的依赖库,pyinstaller
版本与安装所需依赖库版本不冲突hook-xxx.py
(问题2)并放入Pyinstaller
的hooks
文件夹下,解决无法打包的项目子目录文件夹问题这块还挺简单,就直接上代码
#include <iostream>
#include <Windows.h>
#include <shellapi.h>
using namespace std;
string input1(string a, string b)
{
# a 与 b之间加个空格
string c = " ";
string d;
d = a + c + b;
return d;
}
int main()
{ //只调用一个参数
//string a;
//string b;
//string c =" ";
//string d;
//string b;
//cin >> a;
//cin >> b;
//d = a + c + b;
//cout << a << endl;
//cout << b << endl;
//cout << d << endl;
// b = "--source C:\\Users\\HP\\Desktop\\bus.jpg";
//调用两个参数 source 与 project
string a = "--source";
string img_path;
string b = "--project";
string save_path;
string img;
string save;
string param;
cin >> img_path;
cin >> save_path;
img = input1(a, img_path);
save = input1(b, save_path);
param = input1(img, save);
//这里如果是不带参数的exe,则直接用system("C:\\Demo\\Demo.exe")
//system("D:\\python\\exe\\yolov5-master\\yolov5-master\\dist\\detect\\detect.exe");
// ShellExecuteA(带参调用)
//ShellExecuteA(NULL, "open", "D:\\python\\detect\\yolov5-master\\dist\\detect.exe", param.c_str(), NULL, SW_SHOW);
ShellExecuteA(NULL, "open", ".\\detect.exe", param.c_str(), NULL, SW_SHOW);
while (0);
return 0;
}
Copyright © 2003-2013 www.wpsshop.cn 版权所有,并保留所有权利。