使用PyQt5开发了一个基于paddle ocr的文字识别程序,打包的时候报错了。给大家分享一下解决方法
- 为了测试paddle模块的打包问题,所以当前demo.py只引用了paddleOCR模块
- demo.py
python
from paddleocr import PaddleOCR
def ocr_text(path):
try:
ocr = PaddleOCR(use_angle_cls=True, use_gpu=False)
text = ocr.ocr(path, cls=True)
result = []
for t in text[0]:
txt = t[1][0]
result.append(txt)
return result
except:
pass
if __name__ == '__main__':
ocr_text("./screen.png")
步骤一:显式导入依赖项
- 显式导入依赖项:在你的demo.py文件中,尝试显式导入项目的依赖项,例如paddle和framework_pb2,有助于帮助pyinstaller正确识别这些依赖项。在demo.py文件的顶部添加以导入语句:
python
import paddle
from paddle.fluid.proto import framework_pb2
步骤二:pyinstaller的.spec文件中加入--add-data选项
- 将paddle所需的文件包含进去。通常包括ocr的模型文件和其他依赖项。
--add-data
选项将本地paddle路径path/to/paddle
目录文件添加到生成的可执行文件中,使用;
分割,./paddle
代表的是生成文件的同级目录下的paddle文件中。
shell
pyinstaller --add-data "path/to/paddle;./paddle" --add-data "path/to/paddleocr;./paddleocr"
完成程序和打包脚本
python
from paddleocr import PaddleOCR
import paddle # 新增
from paddle.fluid.proto import framework_pb2 # 新增
def ocr_text(path):
try:
ocr = PaddleOCR(use_angle_cls=True, use_gpu=False)
text = ocr.ocr(path, cls=True)
result = []
for t in text[0]:
txt = t[1][0]
result.append(txt)
return result
except:
pass
if __name__ == '__main__':
ocr_text("./screen.png")
- 打包处理
--add-data
添加选项包到程序目录中,-F
将生成一个单一的可执行文件,这里导入了项目中用到的paddle和paddleocr两个包。
shell
pyinstaller -F demo.py --add-data "path/to/paddle;./paddle" --add-data "path/to/paddleocr;./paddleocr"
- 最后打包成功