| 123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116 |
- /**
- * 安装 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();
|