diff --git a/scripts/start.sh b/scripts/start.sh index 51d674b..33a5a6c 100755 --- a/scripts/start.sh +++ b/scripts/start.sh @@ -35,10 +35,12 @@ if [ $? -ne 0 ]; then pip uninstall -y -q opencv-python 2>/dev/null || true pip install -q -i https://pypi.tuna.tsinghua.edu.cn/simple "opencv-python-headless>=4.8,<5" # 5.x wheel 无 cv2 模块,锁定 4.x - # pip 24.0 解压 abi3 wheel 偶发丢根文件(4.14.0.94 实测 site-packages/cv2 只剩子目录, - # cv2.abi3.so / __init__.py 缺失 → import cv2 成空壳,OCR 全挂)→ 空壳检测 + wheel 手动解压兜底(幂等) + # pip 24.0 解压 abi3 wheel 偶发丢根文件(site-packages/cv2 只剩子目录, + # cv2.abi3.so / __init__.py 缺失 → import cv2 成空壳,OCR 全挂)。 + # 手动解压兜底在部分环境修不好(解压后仍无 cv2.__version__), + # 实测 pip --force-reinstall 完整安装有效(220 验证 cv2 4.14.0 恢复)。 python3 - <<'PY' -import glob, os, shutil, site, subprocess, sys, zipfile +import subprocess, sys def cv2_ok(): try: @@ -49,20 +51,14 @@ def cv2_ok(): if cv2_ok(): sys.exit(0) -print("cv2 空壳,wheel 手动解压修复...") -r = subprocess.run(["pip", "download", "--no-deps", "-q", +print("cv2 异常,pip 强制重装 opencv-python-headless...") +r = subprocess.run(["pip", "install", "--force-reinstall", "-q", "-i", "https://pypi.tuna.tsinghua.edu.cn/simple", - "-d", "/tmp/ocv", "opencv-python-headless>=4.8,<5"], capture_output=True) -if r.returncode != 0: - sys.exit(1) -w = sorted(glob.glob("/tmp/ocv/opencv_python_headless*.whl"))[-1] -with zipfile.ZipFile(w) as z: - z.extractall("/tmp/ocv") -dst = os.path.join(site.getsitepackages()[0], "cv2") -shutil.rmtree(dst, ignore_errors=True) -shutil.copytree("/tmp/ocv/cv2", dst) -import cv2 -print(f"cv2 {cv2.__version__} 手动解压修复完成") + "opencv-python-headless>=4.8,<5"]) +if r.returncode == 0: + import cv2 + print(f"cv2 {cv2.__version__} 重装修复完成") +sys.exit(r.returncode) PY else echo "[start] 依赖已就绪(cv2 $(python3 -c 'import cv2; print(cv2.__version__)' 2>/dev/null)),跳过安装"