问题: - PyInstaller在分析阶段尝试导入torch/transformers等ML库 - 这些库与Python 3.13不兼容,导致"Windows fatal exception: access violation" - 构建过程无法完成,无法生成exe文件 解决方案: 1. 添加pyi_hooks/pyi_rth_ignore_torch.py运行时hook - 在PyInstaller分析阶段阻止torch等模块的导入 - 这些模块将在运行时动态安装 2. 添加pyi_hooks/hook-exclude-ml.py和hook-paddleocr.py - 明确告诉PyInstaller不收集这些ML库 3. 更新build.bat和build.sh - 使用--runtime-hook和--additional-hooks-dir - 添加--exclude-module参数排除所有ML库 测试: - 验证所有hook文件语法正确 - 验证项目核心功能可以在不导入torch的情况下正常工作 Co-Authored-By: Claude Opus 4.6 <noreply@anthropic.com>
101 lines
2.5 KiB
Bash
101 lines
2.5 KiB
Bash
#!/bin/bash
|
|
# CutThenThink 简化打包脚本
|
|
|
|
set -e
|
|
|
|
echo "==================================="
|
|
echo "CutThenThink 打包脚本"
|
|
echo "==================================="
|
|
|
|
# 使用系统Python和pip
|
|
PYTHON="python3"
|
|
PIP="python3 -m pip"
|
|
|
|
echo ""
|
|
echo "1/4. 安装打包工具..."
|
|
$PIP install --user pyinstaller 2>/dev/null || echo " PyInstaller可能已安装"
|
|
|
|
echo ""
|
|
echo "2/4. 安装项目依赖..."
|
|
$PIP install --user -r requirements.txt 2>/dev/null || echo " 依赖可能已安装"
|
|
|
|
echo ""
|
|
echo "3/4. 创建应用入口(如果不存在)..."
|
|
if [ ! -f "src/main.py" ]; then
|
|
cat > src/main.py << 'PYEOF'
|
|
#!/usr/bin/env python3
|
|
# -*- coding: utf-8 -*-
|
|
"""
|
|
CutThenThink 应用入口
|
|
"""
|
|
import sys
|
|
import os
|
|
|
|
# 添加src目录到路径
|
|
current_dir = os.path.dirname(os.path.abspath(__file__))
|
|
sys.path.insert(0, current_dir)
|
|
|
|
from gui.main_window import main
|
|
|
|
if __name__ == "__main__":
|
|
main()
|
|
PYEOF
|
|
fi
|
|
|
|
echo ""
|
|
echo "4/4. 开始打包..."
|
|
echo "NOTE: 使用自定义 hooks 排除与 Python 3.13 不兼容的 ML 库"
|
|
$PYTHON -m PyInstaller \
|
|
--name "CutThenThink" \
|
|
--windowed \
|
|
--onefile \
|
|
--add-data "src:src" \
|
|
--runtime-hook=pyi_hooks/pyi_rth_ignore_torch.py \
|
|
--additional-hooks-dir=pyi_hooks \
|
|
--hidden-import=PyQt6.QtCore \
|
|
--hidden-import=PyQt6.QtGui \
|
|
--hidden-import=PyQt6.QtWidgets \
|
|
--hidden-import=sqlalchemy \
|
|
--hidden-import=sqlalchemy.orm \
|
|
--hidden-import=PIL \
|
|
--hidden-import=PIL.Image \
|
|
--hidden-import=PIL.ImageEnhance \
|
|
--hidden-import=PIL.ImageFilter \
|
|
--hidden-import=numpy \
|
|
--hidden-import=pyperclip \
|
|
--hidden-import=tkinter \
|
|
--hidden-import=tkinter.ttk \
|
|
--hidden-import=tkinter.scrolledtext \
|
|
--hidden-import=tkinter.messagebox \
|
|
--hidden-import=yaml \
|
|
--hidden-import=requests \
|
|
--collect-all pyqt6 \
|
|
--exclude-module=torch \
|
|
--exclude-module=transformers \
|
|
--exclude-module=tensorflow \
|
|
--exclude-module=onnx \
|
|
--exclude-module=onnxruntime \
|
|
--exclude-module=sentencepiece \
|
|
--exclude-module=tokenizers \
|
|
--exclude-module=diffusers \
|
|
--exclude-module=accelerate \
|
|
--exclude-module=datasets \
|
|
--exclude-module=huggingface_hub \
|
|
--exclude-module=safetensors \
|
|
src/main.py
|
|
|
|
echo ""
|
|
echo "==================================="
|
|
echo "打包完成!"
|
|
echo "可执行文件: dist/CutThenThink"
|
|
echo "==================================="
|
|
|
|
# 测试运行提示
|
|
echo ""
|
|
read -p "是否测试运行?(y/n) " -n 1 -r
|
|
echo
|
|
if [[ $REPLY =~ ^[Yy]$ ]]; then
|
|
echo "启动测试..."
|
|
./dist/CutThenThink
|
|
fi
|