参考资料:
Pyinstaller 打包 PaddleOcr + PyQt5 项目的打包过程、常见问题及解决方法_paddleocr打包太难了-CSDN博客
问题描述:
我使用如下命令打包我的项目pyinstaller -D --name=ocrapp --windowed --collect-all paddleocr --collect-all pyclipper --collect-all imghdr --collect-all skimage --collect-all imgaug --collect-all scipy.io --collect-all lmdb --collect-all paddle main.py,然后再dist下生成了exe文件,在本机上打开后正常运行,但是当我发送给别人后,出现了以下报错:
Traceback (most recent call last): File "table_ocr.py", line 1458, in <module> File "table_ocr.py", line 36, in init File "paddleocr\paddleocr.py", line 675, in init maybe_download(params.det_model_dir, det_url) File "paddleocr\ppocr\utils\network.py", line 116, in maybe_download download_with_progressbar(url, tmp_path) File "paddleocr\ppocr\utils\network.py", line 43, in download_with_progressbar _download(url, save_path) File "paddleocr\ppocr\utils\network.py", line 93, in _download with tqdm(total=(int(total_size) + 1023) // 1024) as pbar: File "tqdm\std.py", line 1098, in init File "tqdm\std.py", line 1347, in refresh File "tqdm\std.py", line 1495, in display File "tqdm\std.py", line 459, in print_status File "tqdm\std.py", line 452, in fp_write File "tqdm\utils.py", line 140, in getattr AttributeError: 'NoneType' object has no attribute 'write'
根本原因:
1. paddleOCR会根据固定路径去找模型
2. 需要修改 paddleocr.py的搜索路径代码
解决方案:
找到虚拟环境中的 paddleocr.py
(通常路为 .../Lib/sitepackages/paddleocr/paddleocr.py
),修改以下代码:
# 修改前(默认路径指向用户目录)
BASE_DIR = os.path.expanduser("~/.paddleocr/")
# 修改后(指向当前项目目录)
BASE_DIR = os.path.join(os.path.dirname(os.path.abspath(__file__)), ".paddleocr")
然后打包项目
pyinstaller -D --name=ocrapp --windowed --collect-all paddleocr --collect-all pyclipper --collect-all imghdr --collect-all skimage --collect-all imgaug --collect-all scipy.io --collect-all lmdb --collect-all paddle main.py
生成了dist文件夹
在 C:\Users\nihao.dong\下找到模型位置 .paddleocr
然后粘贴复制到dist文件夹下
完毕双击exe,程序会基于当前目录查询模型。
具体原因: