Pyinstaller将yolov5的detect.py封装成detect.exe,并用C++调用

Pyinstaller打包与c++调用

  • Pyinstaller打包
    • Pyinstall常用命令
    • Pyinstaller的踩坑记录
    • pyinstaller打包流程
  • C++调用
    • vs2019创建一个解决方案调用

Pyinstaller打包

Pyinstall常用命令

# 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

Pyinstaller的踩坑记录

  1. 第一步,直接使用pyisntaller -F detect.py打包后报错,
问题: no moudel ‘xxxx’
解决办法 : 在打包之前用pip install xxxx安装好这个依赖库
  1. 第二步,安装好所有环境后 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中才能被打包

Pyinstaller将yolov5的detect.py封装成detect.exe,并用C++调用_第1张图片

  1. 第三步,配置好打包依赖库后 pyisntaller -F detect.py报错
问题:yolov5l.pt权重文件与data目录下的yaml配置文件没有被打包进exe文件
解决方案:
在pyinstaller生成的detect.desc配置文件中有一项datas=[],如下图所示:
将文件夹的名字data手动写入datas中,datas =[('data','data'),('yolov5l.pt','yolov5l')]
()中第一项是需要打包的文件,第二项是打包后该文件的名字

Pyinstaller将yolov5的detect.py封装成detect.exe,并用C++调用_第2张图片
到这里出现了一个奇怪的问题,项目目录如下,yolov5.pt在一级目录下,理应被直接打包进exe,我第一次尝试时成功了,运行detec.exe不用Download yolov5l.pt,说明权重文件打包成功了,但后续遇到其他问题的时候,用上述配置文件重新打包后调用detect.exe却要重新下载,这就让我很不理解,于是我将yolov5l.pt也放入了data目录文件下,并将detect.py文件中--weight参数的默认路径设置为./data/yolov5l.pt再使用pyinstaller打包就解决了这个问题.
Pyinstaller将yolov5的detect.py封装成detect.exe,并用C++调用_第3张图片

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版本匹配才能成功打包。

pyinstaller打包流程

  • 创建一个虚拟环境,并安装project的依赖库,
  • 确认pyinstaller版本与安装所需依赖库版本不冲突
  • 创建一个hook-xxx.py(问题2)并放入Pyinstallerhooks文件夹下,解决无法打包的项目子目录文件夹问题
  • 对于在根目录下无法打包的配置文件如权重文件,将他放到其他可打包的文件夹,然后修改一下调用路径即可
  • 最后在cmd中测试一下exe是否正常运行。

C++调用

vs2019创建一个解决方案调用

这块还挺简单,就直接上代码

#include 
#include 
#include 

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;
}

你可能感兴趣的:(c++,python)