AssertionError: …/distutils/core.pyc
重新安装setuptools
工具,笔者所试的版本58.0.0
可以解决此问题
pip install setuptools==58.0.0
打包完成运行时出现paddle\\fluid\\..\\libs
问题
暴力一点的解决方法就是把虚拟环境重的paddle
与paddleocr
放到打包好的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