/** * 安装 Python 包到便携版 Python */ import { exec } from 'child_process'; import { promisify } from 'util'; import { join, dirname } from 'path'; import { fileURLToPath } from 'url'; import { existsSync } from 'fs'; const execAsync = promisify(exec); const __filename = fileURLToPath(import.meta.url); const __dirname = dirname(__filename); const projectRoot = __dirname; const pythonExe = join(projectRoot, 'python', 'python.exe'); // 安装脚本内容 const installScript = ` import sys import os import site import subprocess # 确保 site-packages 被加载 site.main() # 添加 site-packages 到 sys.path(如果还没有) site_packages = os.path.join(os.path.dirname(sys.executable), 'Lib', 'site-packages') if site_packages not in sys.path: sys.path.insert(0, site_packages) # 使用 ensurepip 安装 pip(如果还没有) try: import pip except ImportError: print("正在安装 pip...") import ensurepip ensurepip.bootstrap() import pip # 安装包 packages = ['opencv-python', 'numpy', 'onnxocr'] print(f"正在安装包: {', '.join(packages)}") for package in packages: print(f"\\n安装 {package}...") result = subprocess.run( [sys.executable, '-m', 'pip', 'install', package], capture_output=True, text=True, encoding='utf-8' ) if result.returncode == 0: print(f"✓ {package} 安装成功") else: print(f"✗ {package} 安装失败:") print(result.stderr) print(result.stdout) print("\\n安装完成!") `; async function main() { try { if (!existsSync(pythonExe)) { console.error('错误: Python 可执行文件不存在:', pythonExe); process.exit(1); } console.log('正在安装 Python 包...'); console.log('Python 路径:', pythonExe); // 将脚本写入临时文件 const scriptPath = join(projectRoot, 'temp_install_packages.py'); await import('fs/promises').then(fs => fs.writeFile(scriptPath, installScript, 'utf8') ); // 执行安装脚本 const { stdout, stderr } = await execAsync( `"${pythonExe}" "${scriptPath}"`, { cwd: projectRoot, encoding: 'utf8', env: { ...process.env, PYTHONIOENCODING: 'utf-8', PYTHONUTF8: '1' }, timeout: 300000 // 5分钟超时 } ); console.log(stdout); if (stderr) { console.error(stderr); } // 清理临时文件 try { await import('fs/promises').then(fs => fs.unlink(scriptPath)); } catch (e) { // 忽略删除失败 } console.log('\n✓ 安装完成!'); } catch (error) { console.error('安装失败:', error.message); if (error.stdout) console.log('stdout:', error.stdout); if (error.stderr) console.error('stderr:', error.stderr); process.exit(1); } } main();