install-python-packages.js 2.8 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116
  1. /**
  2. * 安装 Python 包到便携版 Python
  3. */
  4. import { exec } from 'child_process';
  5. import { promisify } from 'util';
  6. import { join, dirname } from 'path';
  7. import { fileURLToPath } from 'url';
  8. import { existsSync } from 'fs';
  9. const execAsync = promisify(exec);
  10. const __filename = fileURLToPath(import.meta.url);
  11. const __dirname = dirname(__filename);
  12. const projectRoot = __dirname;
  13. const pythonExe = join(projectRoot, 'python', 'python.exe');
  14. // 安装脚本内容
  15. const installScript = `
  16. import sys
  17. import os
  18. import site
  19. import subprocess
  20. # 确保 site-packages 被加载
  21. site.main()
  22. # 添加 site-packages 到 sys.path(如果还没有)
  23. site_packages = os.path.join(os.path.dirname(sys.executable), 'Lib', 'site-packages')
  24. if site_packages not in sys.path:
  25. sys.path.insert(0, site_packages)
  26. # 使用 ensurepip 安装 pip(如果还没有)
  27. try:
  28. import pip
  29. except ImportError:
  30. print("正在安装 pip...")
  31. import ensurepip
  32. ensurepip.bootstrap()
  33. import pip
  34. # 安装包
  35. packages = ['opencv-python', 'numpy', 'onnxocr']
  36. print(f"正在安装包: {', '.join(packages)}")
  37. for package in packages:
  38. print(f"\\n安装 {package}...")
  39. result = subprocess.run(
  40. [sys.executable, '-m', 'pip', 'install', package],
  41. capture_output=True,
  42. text=True,
  43. encoding='utf-8'
  44. )
  45. if result.returncode == 0:
  46. print(f"✓ {package} 安装成功")
  47. else:
  48. print(f"✗ {package} 安装失败:")
  49. print(result.stderr)
  50. print(result.stdout)
  51. print("\\n安装完成!")
  52. `;
  53. async function main() {
  54. try {
  55. if (!existsSync(pythonExe)) {
  56. console.error('错误: Python 可执行文件不存在:', pythonExe);
  57. process.exit(1);
  58. }
  59. console.log('正在安装 Python 包...');
  60. console.log('Python 路径:', pythonExe);
  61. // 将脚本写入临时文件
  62. const scriptPath = join(projectRoot, 'temp_install_packages.py');
  63. await import('fs/promises').then(fs =>
  64. fs.writeFile(scriptPath, installScript, 'utf8')
  65. );
  66. // 执行安装脚本
  67. const { stdout, stderr } = await execAsync(
  68. `"${pythonExe}" "${scriptPath}"`,
  69. {
  70. cwd: projectRoot,
  71. encoding: 'utf8',
  72. env: {
  73. ...process.env,
  74. PYTHONIOENCODING: 'utf-8',
  75. PYTHONUTF8: '1'
  76. },
  77. timeout: 300000 // 5分钟超时
  78. }
  79. );
  80. console.log(stdout);
  81. if (stderr) {
  82. console.error(stderr);
  83. }
  84. // 清理临时文件
  85. try {
  86. await import('fs/promises').then(fs => fs.unlink(scriptPath));
  87. } catch (e) {
  88. // 忽略删除失败
  89. }
  90. console.log('\n✓ 安装完成!');
  91. } catch (error) {
  92. console.error('安装失败:', error.message);
  93. if (error.stdout) console.log('stdout:', error.stdout);
  94. if (error.stderr) console.error('stderr:', error.stderr);
  95. process.exit(1);
  96. }
  97. }
  98. main();