PaddleOCR 打包出现问题及解决方法

情况一

错误

AssertionError: …/distutils/core.pyc

解决方法

重新安装setuptools工具,笔者所试的版本58.0.0可以解决此问题

pip install setuptools==58.0.0

情景二

错误

打包完成运行时出现paddle\\fluid\\..\\libs问题

解决方法

暴力一点的解决方法就是把虚拟环境重的paddlepaddleocr放到打包好的exe的同级目录中。
当将上述问题解决完以后,接下来还会出现以下问题

ModuleNotFoundError: No module named 'shapely'
ModuleNotFoundError: No module named 'pyclipper'
ModuleNotFoundError: No module named 'skimage'
ModuleNotFoundError: No module named 'pywt'
ModuleNotFoundError: No module named 'imgaug'
ModuleNotFoundError: No module named 'imageio'
ModuleNotFoundError: No module named 'fasttext'
ModuleNotFoundError: No module named 'lmdb'

ModuleNotFoundError: No module named 'imghdr'  
ModuleNotFoundError: No module named 'fasttext_pybind'

ImportError: cannot import name 'signal' from 'scipy' (...\scipy\__init__.pyc)

这是因为paddleocr要调用的库太多了, pyinstaller没有把所有的模块都打包进去,这时需要
我们手动把这些模块打包进去

如何在打包时放到exe同级目录呢,这时需要用到Pyinstaller--add-data
以下是封装的一段代码示例

def get_extra_params():
    # 项目根目录
    root_path = get_root_path()
    extra_data = [
        ("src\\res", "src\\res"),
        ("config", "config"),
        ("venv\\Lib\\site-packages\\Shapely.libs", "Shapely.libs"),
        ("venv\\Lib\\site-packages\\paddle", "paddle"),
        ("venv\\Lib\\site-packages\\paddleocr", "paddleocr"),
        ("venv\\Lib\\site-packages\\PIL", "PIL"),
        ("venv\\Lib\\site-packages\\pywt", "pywt"),
        ("venv\\Lib\\site-packages\\lmdb", "lmdb"),
        ("venv\\Lib\\site-packages\\shapely", "shapely"),
        ("venv\\Lib\\site-packages\\skimage", "skimage"),
        ("venv\\Lib\\site-packages\\pyclipper", "pyclipper"),
        ("venv\\Lib\\site-packages\\scipy", "scipy"),
        ("venv\\Lib\\site-packages\\imgaug", "imgaug"),
        ("venv\\Lib\\site-packages\\imageio", "imageio"),
        ("venv\\Lib\\site-packages\\attrdict", "attrdict")]
    params = []
    for item in extra_data:
        src_path = os.path.join(root_path, item[0])
        params.extend(["--add-data", f"{src_path};{item[1]}"])
    return params

其中imghdr是Python目录中的一个文件,直接在程序代码中调用就行

import imghdr
import shapely

情况三

错误

subprocess的错误。也是运行出现多个exe的问题

解决方式

在虚拟环境下的这个文件中\site-packages\paddle\dataset\image.py

if six.PY3:
    import subprocess
    import sys
    import_cv2_proc = subprocess.Popen(
        [sys.executable, "-c", "import cv2"],
        stdout=subprocess.PIPE,
        stderr=subprocess.PIPE)
    out, err = import_cv2_proc.communicate()
    retcode = import_cv2_proc.poll()
    if retcode != 0:
        cv2 = None
    else:
        import cv2
else:
    try:
        import cv2
    except ImportError:
        cv2 = None

删除上述代码,改为以下内容

try:
    import cv2
except ImportError:
    cv2 = None

你可能感兴趣的:(Python,python,PaddleOCR)