# Python Core 分发解决方案 ## 问题背景 当前项目使用 `python -m python_core.services.xxx` 的方式调用Python模块,这在开发环境下工作正常,但打包成exe后会遇到以下问题: 1. **Python环境依赖**:用户机器可能没有安装Python或缺少依赖包 2. **模块路径问题**:python_core目录不在用户的Python路径中 3. **分发复杂性**:需要用户单独安装Python环境 ## 解决方案:Tauri Sidecar + PyInstaller ### 方案概述 使用PyInstaller将Python代码打包成独立可执行文件,作为Tauri的sidecar与主应用一起分发。 ### 优势 1. **无需Python环境**:用户无需安装Python 2. **依赖自包含**:所有Python依赖都打包在内 3. **分发简单**:单个exe文件包含所有功能 4. **性能优化**:避免Python解释器启动开销 5. **安全性**:代码被编译,不易被逆向 ## 实现步骤 ### 1. 创建Python入口文件 **文件**: `python_core/main.py` 这是PyInstaller的入口点,提供统一的命令行接口: ```python # 支持模块映射 MODULE_MAP = { 'template_manager': 'services.template_manager', 'project_manager': 'services.project_manager', # ... 更多模块 } # 统一的执行接口 def execute_action(module_name, action, params=None, progress_callback=None): # 动态加载和执行模块函数 ``` ### 2. PyInstaller配置 **文件**: `python_core/build.spec` 配置打包选项: - 隐藏导入:确保所有模块被包含 - 数据文件:包含配置和资源文件 - 排除模块:减少打包大小 - 单文件模式:生成单个可执行文件 ### 3. 自动化构建脚本 **文件**: `scripts/build_python_core.py` 提供完整的构建流程: 1. 安装构建依赖 2. 清理构建目录 3. 运行PyInstaller 4. 复制到sidecar目录 5. 更新Tauri配置 6. 验证构建结果 ### 4. Rust代码适配 **文件**: `src-tauri/src/python_executor.rs` 添加sidecar支持: - 自动检测sidecar可用性 - 开发环境使用系统Python - 生产环境使用sidecar - 统一的API接口 ## 使用方法 ### 构建Python Core #### Windows ```cmd scripts\build_python_core.bat ``` #### Linux/macOS ```bash ./scripts/build_python_core.sh ``` #### 手动构建 ```bash python scripts/build_python_core.py ``` ### 开发和测试 ```bash # 开发模式(使用系统Python) cargo tauri dev # 生产构建(包含sidecar) cargo tauri build ``` ### API调用 ```rust // 新的模块化API use crate::python_executor::execute_python_module_action; #[tauri::command] pub async fn my_command(app: AppHandle) -> Result { let params = serde_json::json!({ "folder_path": "/path/to/templates", "force_reimport": false }); execute_python_module_action( app, "template_manager", // 模块名 "batch_import", // 动作名 Some(params), // 参数 None // 配置 ).await } ``` ## 文件结构 ``` project/ ├── python_core/ │ ├── main.py # PyInstaller入口文件 │ ├── build.spec # PyInstaller配置 │ ├── services/ # 服务模块 │ ├── utils/ # 工具模块 │ └── ... ├── scripts/ │ ├── build_python_core.py # 构建脚本 │ ├── build_python_core.bat# Windows批处理 │ └── build_python_core.sh # Linux/macOS脚本 ├── src-tauri/ │ ├── binaries/ # sidecar可执行文件 │ │ └── mixvideo-python-core(.exe) │ ├── src/ │ │ └── python_executor.rs # 更新的执行器 │ └── tauri.conf.json # 更新的配置 └── docs/ └── PYTHON_CORE_DISTRIBUTION.md ``` ## 配置说明 ### Tauri配置更新 `src-tauri/tauri.conf.json`: ```json { "bundle": { "externalBin": [ { "name": "mixvideo-python-core", "src": "binaries/mixvideo-python-core", "targets": ["all"] } ] } } ``` ### 环境检测逻辑 ```rust fn should_use_sidecar() -> bool { #[cfg(not(debug_assertions))] { // 生产环境:检查sidecar是否存在 return get_sidecar_path().is_some(); } // 开发环境:使用系统Python false } ``` ## 性能对比 | 方案 | 启动时间 | 内存占用 | 分发大小 | 依赖管理 | |------|----------|----------|----------|----------| | 系统Python | 慢 | 低 | 小 | 复杂 | | PyInstaller | 快 | 中 | 大 | 简单 | ## 故障排除 ### 常见问题 #### 1. 构建失败 ```bash # 检查Python环境 python --version pip --version # 安装构建依赖 pip install pyinstaller requests Pillow opencv-python-headless ``` #### 2. 模块导入错误 - 检查 `build.spec` 中的 `hiddenimports` - 添加缺失的模块到隐藏导入列表 #### 3. 资源文件缺失 - 检查 `build.spec` 中的 `datas` 配置 - 确保所有资源文件都被包含 #### 4. sidecar不可用 - 检查 `src-tauri/binaries/` 目录 - 验证可执行文件权限 - 查看Tauri配置中的sidecar设置 ### 调试方法 #### 1. 测试sidecar ```bash # 直接测试可执行文件 ./src-tauri/binaries/mixvideo-python-core --version ./src-tauri/binaries/mixvideo-python-core --module template_manager --action get_templates ``` #### 2. 查看日志 ```rust // 在Rust代码中添加调试输出 println!("Using sidecar: {}", should_use_sidecar()); println!("Sidecar path: {:?}", get_sidecar_path()); ``` #### 3. 环境变量 ```bash # 强制使用系统Python(调试用) export MIXVIDEO_FORCE_SYSTEM_PYTHON=1 ``` ## 最佳实践 ### 1. 开发流程 1. 在开发环境使用系统Python进行开发和测试 2. 定期构建sidecar验证打包正确性 3. 在CI/CD中自动化构建流程 ### 2. 版本管理 - 为sidecar添加版本信息 - 在主应用中检查sidecar版本兼容性 - 提供版本不匹配时的降级方案 ### 3. 错误处理 - 提供详细的错误信息 - 实现自动重试机制 - 支持降级到系统Python ### 4. 性能优化 - 使用单文件模式减少启动时间 - 排除不必要的模块减少大小 - 考虑使用UPX压缩可执行文件 ## 未来改进 ### 短期计划 - [ ] 添加自动更新机制 - [ ] 支持插件化架构 - [ ] 优化启动性能 ### 长期计划 - [ ] 考虑使用Rust重写核心逻辑 - [ ] 支持多语言sidecar - [ ] 集成云端分发 --- 通过这个解决方案,我们成功解决了Python代码分发的问题,为用户提供了无需Python环境的一体化体验。