开发ocr推理程序,使用python 做的程序,转c++时间来不及,故采用python直接和主程序通讯模式:
1,python 负责推理程序。
2,python中增加通讯接口,可为socket 或者IPC方式,因为便于查看方便,我使用信号流是通讯方式,数据流是本地方式。
3,推理程序开socket通讯,做服务器。
4,主程序shellexcute执行ocr推理程序,我利用的bat指令。
5,推理程序服务器开启。
6,主程序链接服务器。
7,主程序将检测图放入本地目录,发送指令给服务器可以检测图像了,到固定路径下方寻找图像,处理完成放入完成的dest目录下方。
8,推理程序发送处理完成结果信号给主程序,主程序去拿结果,完成一个cycle。
9,推理程序开始的时候利用pyinstaller打包,发现打包太大,800M+,然后还经常解压到临时路径,然后有时候异常退出这个打包的文件夹的临时文件还不删除,导致c盘涨涨涨。
10,并且每次打包exe太慢了,浪费太多时间,每次改动还得打包,于是改为pyd方式,简单方便,不用加密。
11,注意pyd需要引导启动,我用了mainocr程序启动。
12,mainocr改为pyc方式,未加密。
整个过程总结如下:
下载和安装
参考:https://www.jianshu.com/p/a2dbb346164a 和https://zhuanlan.zhihu.com/p/38659588
1,安装pyinstaller ,也可以pip install pyinstaller也可以自己手动下载,2,安装pywin32-227.win-amd64-py3.6.exe。
测试
在命令行中直接输入下面的指令即可
pyinstaller [opts] yourprogram.py
我用了
cd
到当前按照目录,然后
python pyinstaller.py --console --onefile test/xxxx.py
参数含义
-F 指定打包后只生成一个exe格式的文件(建议写上这个参数)
-D –onedir 创建一个目录,包含exe文件,但会依赖很多文件(默认选项)
-c –console, –nowindowed 使用控制台,无界面(默认)
-w –windowed, –noconsole 使用窗口,无控制台
-p 添加搜索路径,让其找到对应的库。
-i 改变生成程序的icon图标(比如给女朋友写的程序,换个好看的图标,默认的很丑)
实例说明
- 比如你有个python程序叫test.py,绝对路径在[D:\project],打包成一个exe格式的文件
pyinstaller -F D:\project\test.py
- 条件同上,如果还希望没有控制台的黑框框,在进程中偷偷运行
pyinstaller -F -w D:\project\test.py
- 条件同上,如果还希望更换程序图标
失败:
pyinstaller -F -w -i D:\project\test.ico D:\project\test.py
验证可行:
python pyinstaller.py --console --onefile test/xxxx.py
实验中:
失败#python pyinstaller.py -F -w -i D:\ZZ\others-frame\OCR-ref\PyInstaller-3.6\test\ocr.ico .\test\ocr.py
失败#python pyinstaller.py -F -w -i D:\ZZ\others-frame\OCR-ref\PyInstaller-3.6\test\ocr.ico .\test\ocr.py
失败#python pyinstaller.py --console
-F -w -i D:\ZZ\others-frame\OCR-ref\PyInstaller-3.6\test\ocr.ico .\test\ocr.py
失败#python pyinstaller.py –-console --onefile
-F -w -i D:\ZZ\others-frame\OCR-ref\PyInstaller-3.6\test\ocr.ico .\test\ocr.py
失败#python pyinstaller.py –-console --onefile
-i D:\ZZ\others-frame\OCR-ref\PyInstaller-3.6\test\ocr.ico .\test\ocr.py
成功:python pyinstaller.py –-console --onefile
--i D:\ZZ\others-frame\OCR-ref\PyInstaller-3.6\test\ocr.ico .\test\ocr.py
自己程序报错处理
报错:
-
- 报错:RecursionError: maximum recursion depth exceeded,递归次数超限。可以参考https://blog.csdn.net/CeasarD/article/details/103237755,但是我用的方法是,在xx \PyInstaller-3.6\PyInstaller\__main__.py下面添加了如下,
import sys sys.setrecursionlimit(100000) #例如这里设置为十万
问题解决
2,报错:UnicodeDecodeError: 'utf-8' codec can't decode byte 0xce in position 110: invalid continuation byte;
修改\PyInstaller\compat.py文件中out =
out.decode(encoding)
改为out =
out.decode(encoding, errors='ignore')
。
3, Building PKG because PKG-00.toc is non existent, 报这个问题 后面 继续不用管就成功了。
遇到的问题:
-
- 打包后的exe在已创建的环境上是可以使用的,但是虽然都打包了各个dll,但是不能在没有硬件环境运行,需要继续挖掘,是否必须要安装cuda环境?AMD的怎么处理?CPU的怎么run。(完成,更改cpu 只需要更改
g_myConfigNet['gpuid']='-1' os.environ['CUDA_VISIBLE_DEVICES'] = str(g_myConfigNet['gpuid'])#strgpuid # '1' os.environ["CUDA_DEVICE_ORDER"] = "PCI_BUS_ID")
- 注意环境搭建中最好不要用anaconda环境,太庞大,导致依赖一堆包,测试发现单独不用anaconda,exe打包小了200M+。
- Py文件打包的程序会在c盘下面生成一个tem的文件夹下方出现临时路径然后会将exe下方打包py依赖的第三方库放在里面。如果exe不正常退出,那么C盘会不断增加,因为只有exe正常退出后,这个tem文件才会被删除,一旦出现tem文件没有删除,下次进入tem不断增加,c盘出现过大临时垃圾文件,可以用第三方工具清理此文件。
- 程序逻辑问题,我利用了sokcet通讯方式,开启4个服务器,因为4个服务器不会同时断开,利用killl的方式杀掉主线程,setdaemon导致主程序退出后这几个线程仍然存在几个线程,所以不会回收temp文件。
- 需要继续确定pyd 是否可以被破解,和破解开怎么用。
- 在打包的时候遇到了很多问题,很多指令run完成后发现不能运行。导致打包运行无效。-F –w这些指令无法运行成功。
- 中间出现切片使用错误,https://www.jianshu.com/p/15715d6f4dad,这里讲的很好的切片操作。
- 杀多余占用的端口:
- 打包后的exe在已创建的环境上是可以使用的,但是虽然都打包了各个dll,但是不能在没有硬件环境运行,需要继续挖掘,是否必须要安装cuda环境?AMD的怎么处理?CPU的怎么run。(完成,更改cpu 只需要更改
netstat -ano | findstr 4000
taskkill –F –PID 4524
关于加密:
- 第三方软件加壳,不好破解。
- 利用pyc转化为pyd后进行再加壳。
- Tem文件下方没发现有效ocr.py信息,最好ocr.py加密后再打包。
- 最终打包exe太大,我改为不打包,直接安装依赖包cmd执行程序。
- 注意制作了cmd指令后再c++中运行的时候发现cmd指令是不能认识相对路径的,但是c#的可以很奇怪。所以需要把c++下方的所有路径改为绝对路径。C#:利用process.Start可以。C++之前是shellexcute,C++利用了winexec也可以。 常用指令:
D:\ZZ\others-frame\OCR-ref\pyexe :下方做 pyc和pyd:
pyc:
单个:__pycache__这里面找
python -m py_compile <name>.py
多个:
python -m compileall <path>
pyd:
python setup.py build_ext –inplace
pyinstall:
python pyinstaller.py –-console --onefile
--i D:\ZZ\others-frame\OCR-ref\PyInstaller-3.6\test\ocr.ico .\test\ocr.py