File size: 5,012 Bytes
e275025
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
126
127
128
129
130
131
132
133
134
135
136
137
138
139
140
141
142
143
#!/usr/bin/env python3
"""
Build script for Medical Transcription GUI Application
Скрипт для сборки Windows .exe файла с использованием uv
"""

import os
import sys
import subprocess
from pathlib import Path
import shutil


def build_exe():
    """Собрать Windows .exe файл"""
    
    print("=" * 60)
    print("Medical Transcription GUI - Windows Build (with uv)")
    print("=" * 60)
    
    root_dir = Path(__file__).parent.absolute()
    
    # Проверить наличие uv
    try:
        result = subprocess.run(['uv', '--version'], capture_output=True, text=True)
        if result.returncode == 0:
            print(f"\n✓ uv найден: {result.stdout.strip()}")
        else:
            print("\n❌ uv не установлен или недоступен!")
            print("Установите uv: pip install uv")
            return False
    except FileNotFoundError:
        print("\n❌ uv не найден в PATH!")
        print("Установите uv: pip install uv")
        return False
    
    # Проверить наличие PyInstaller
    print("\n📦 Проверка PyInstaller...")
    try:
        result = subprocess.run(['uv', 'pip', 'list'], capture_output=True, text=True)
        if 'pyinstaller' in result.stdout.lower():
            print("✓ PyInstaller установлен")
        else:
            print("⚠️  PyInstaller не установлен, установим его...")
            subprocess.run(['uv', 'pip', 'install', 'pyinstaller>=6.0.0'])
    except Exception as e:
        print(f"⚠️  Не смогли проверить PyInstaller: {e}")
    
    # Проверить наличие необходимых файлов
    required_files = [
        'run_gui.py',
        'build_windows.spec',
        'medical_terms.txt',
        'app/gui_app.py',
        'pipeline/medical_pipeline.py',
        'corrector/report_generator.py',
    ]
    
    print("\n📋 Проверка необходимых файлов:")
    for file in required_files:
        file_path = root_dir / file
        if file_path.exists():
            print(f"  ✓ {file}")
        else:
            print(f"  ❌ {file} - НЕ НАЙДЕН!")
            return False
    
    # Очистить старые сборки
    print("\n🧹 Очистка старых сборок...")
    for folder in ['dist', 'build', '__pycache__']:
        folder_path = root_dir / folder
        if folder_path.exists():
            shutil.rmtree(folder_path)
            print(f"  Удалена папка: {folder}")
    
    # Запустить PyInstaller через uv
    print("\n🔨 Сборка приложения с PyInstaller...")
    spec_file = root_dir / 'build_windows.spec'
    
    cmd = [
        'uv',
        'run',
        '--',
        'pyinstaller',
        '--onefile',
        '--windowed',
        '--name=MedicalTranscriber',
        str(spec_file)
    ]
    
    print(f"Команда: {' '.join(cmd)}\n")
    
    try:
        result = subprocess.run(cmd, cwd=str(root_dir), capture_output=False, text=True)
        
        if result.returncode != 0:
            print(f"\n❌ Ошибка при сборке с кодом {result.returncode}")
            return False
        
    except Exception as e:
        print(f"\n❌ Ошибка при запуске PyInstaller: {e}")
        return False
    
    # Проверить результат
    exe_path = root_dir / 'dist' / 'MedicalTranscriber.exe'
    if exe_path.exists():
        size_mb = exe_path.stat().st_size / (1024 * 1024)
        print(f"\n✅ Сборка успешна!")
        print(f"📦 {exe_path.name} ({size_mb:.1f} МБ)")
        print(f"📍 Расположение: {exe_path.parent}")
        return True
    else:
        print(f"\n⚠️  Файл .exe не найден в {exe_path.parent}")
        print("Проверьте наличие dist/ папки и наличие ошибок выше")
        return False


def main():
    """Главная функция"""
    success = build_exe()
    
    if success:
        print("\n" + "=" * 60)
        print("🎉 Приложение успешно собрано!")
        print("=" * 60)
        print("\nДля запуска приложения:")
        print("  dist\\MedicalTranscriber.exe")
        print("\nИли двойной клик на файл в проводнике Windows")
        return 0
    else:
        print("\n" + "=" * 60)
        print("❌ Сборка не удалась")
        print("=" * 60)
        print("\nДля отладки:")
        print("  1. Убедитесь что uv установлен: uv --version")
        print("  2. Установите зависимости: uv pip install -r requirements.txt")
        print("  3. Запустите сборку: python build_exe.py")
        return 1


if __name__ == '__main__':
    sys.exit(main())