今天花了一早晨的时间,终于将最近做的一个安全帽检测器收了尾,做的虽然不是很满意,但是
期间踩了很多坑,涨了一波姿势,同时也是自己第一次真正的用机器学习做项目,感受了这个漫长
的过程,学了不少东西,不亏不亏。
因为当初觉得python写机器学习的东西,方便一点,所以就用python开始了。快收尾的时候,发现,
其实用c++写问题也不大啊,这个项目主要用的wx和opencv依然可以随便用啊。。但是都快写完了,
这么多代码移植一下真的太费时间了,但是python写完之后,就是要面对这么一个问题,我们写成
的程序是多个py文件,如果换一台没有解析器,第三方模块没装全的机器,那就废了,所以就要想
办法把他们打包成一个exe文件,开始吧。
首先两种选择,py2exe和pyinstaller,对比了一下,py2exe也太老了,而且在官网好像找不到
支持py3的了,而且网上的一致观点是py2exe效果很不好,打包成的exe存在包括兼容性的一系列
问题,于是便选择了pyinstaller。
直接
装好了,那么开始做吧,于是第一步就遇到了问题,cmd下进入要打包的py文件所在的目录,
执行pyinstaller -F 指令,然后结果只有一句:
failed to create process
这是什么鬼,于是到网上一搜,这样解决:
去第三方库中找到文件:
会看到第一行是一个python.exe路径,把这行的”路径”用引号括起来,保存,再次执行命令,
这个信息不会在出现了,开始打包过程,然而在打包过程就失败了,出现错误。
这里就要说一个问题了,目前来说,以pip方式安装的pyinstaller对于py3.5以上的版本
支持并不是很完善,因此就会出现各种各样的错误。
所以到这里,依然决然的从github上下载源zip的方式进行安装。
下载以后,然后解压后,里面会有一个pyinstaller文件夹,进入
执行setup.py文件即可:
然后再次执行打包命令就不会出现错误了…有点坑…
这次成功打包了,生成了exe文件,于是迫不及待的运行它。
然后跳出了控制台窗口,然后就报错了,说找不到我导入的模块,这个找不到的文件夹就是我的
的打包目录,因为我打算打包的是几个py文件,并不是只有一个,我以为只要将程序入口设在一个
py文件当中,然后将目录里其他模块import就好了,但是报错找不到。
上网了寻求了一下帮助,并没有找到打包多个py的正确方式,所有的打包都是针对单个py的,对于
其他导入的第三方模块,比如cv2,wx之类的并未报错,说明打包过程至少是可以识别python的
sit-packages文件夹的,所以可能将我们的文件都放进去打包应该没啥问题了吧。想了一下,
那我的第三方文件夹就乱套了啊。果断放弃,把所有的文件的代码全部整合到一个py文件当中,
重新打包,ok了,这个时候我的UI窗口可以执行了。
开始运行,导入视频,然后又出问题了,我在控制台中捕捉的视频帧数是0,说明程序中这行代码
并未执行:
然而这句代码却执行了
解决这个问题的方法:
在cv2库中找到如下dll文件:
32位选择第一个,64位选择第二个,然后将这个文件夹放到exe文件所在的同级目录当中,
在我们编写的py文件开头加入一下代码:
然后重新打包,一定要将动态链接库和打包的exe一直放在一起。
同理,我们训练完成的模型bin文件,音频文件以及其他exe中要使用到的文件,
都要放在和exe同级文件夹当中,并且所有类似load()的函数都直接写成文件名即可,比如:
打包完成,能够正常运行了,大功告成。