forked from Tongyi-MAI/MAI-UI
-
Notifications
You must be signed in to change notification settings - Fork 1
Expand file tree
/
Copy pathstart_web_ui.py
More file actions
167 lines (139 loc) · 4.75 KB
/
start_web_ui.py
File metadata and controls
167 lines (139 loc) · 4.75 KB
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
144
145
146
147
148
149
150
151
152
153
154
155
156
157
158
159
160
161
162
163
164
165
166
167
#!/usr/bin/env python3
"""
启动 MAI-UI Web UI
"""
import os
import sys
import subprocess
def check_dependencies():
"""检查依赖是否安装"""
print("检查依赖...")
try:
import gradio as gr
print(" ✓ Gradio 已安装")
except ImportError:
print(" ✗ Gradio 未安装,请运行: pip install gradio>=4.0.0")
return False
try:
import PIL
print(" ✓ Pillow 已安装")
except ImportError:
print(" ✗ Pillow 未安装,请运行: pip install Pillow")
return False
try:
from openai import OpenAI
print(" ✓ OpenAI 已安装")
except ImportError:
print(" ✗ OpenAI 未安装,请运行: pip install openai")
return False
try:
import yaml
print(" ✓ PyYAML 已安装")
except ImportError:
print(" ✗ PyYAML 未安装,请运行: pip install pyyaml")
return False
return True
def check_adb():
"""检查ADB连接"""
print("\n检查 ADB...")
try:
result = subprocess.run(["adb", "version"], capture_output=True, text=True, timeout=5)
if result.returncode == 0:
print(" ✓ ADB 已安装")
# 检查设备连接
result = subprocess.run(["adb", "devices"], capture_output=True, text=True, timeout=5)
lines = result.stdout.strip().split('\n')[1:]
devices = [l.split('\t')[0] for l in lines if '\tdevice' in l]
if devices:
print(f" ✓ 已连接设备: {', '.join(devices)}")
else:
print(" ⚠ 未检测到已连接的设备")
return True
else:
print(" ⚠ ADB 未正确安装")
return False
except FileNotFoundError:
print(" ⚠ ADB 未找到,请确保 ADB 已安装并添加到系统 PATH")
return False
except subprocess.TimeoutExpired:
print(" ⚠ ADB 命令超时")
return False
except Exception as e:
print(f" ⚠ ADB 检查失败: {e}")
return False
def kill_port(port):
"""尝试清理占用端口的进程 (Windows)"""
if os.name != 'nt':
return
try:
cmd_find = f"netstat -ano | findstr :{port}"
result = subprocess.run(cmd_find, shell=True, capture_output=True, text=True)
if result.stdout:
lines = result.stdout.strip().split('\n')
for line in lines:
parts = line.split()
if len(parts) >= 5:
pid = parts[-1]
try:
if int(pid) != os.getpid():
print(f" 发现占用端口 {port} 的进程 PID: {pid},正在终止...")
subprocess.run(f"taskkill /F /PID {pid}", shell=True, capture_output=True)
except ValueError:
pass
except Exception as e:
print(f" 清理端口时出错: {e}")
def main():
print("=" * 50)
print(" MAI-UI Web UI 启动器")
print("=" * 50)
print()
# 检查依赖
if not check_dependencies():
print("\n请先安装缺失的依赖后再启动")
sys.exit(1)
# 检查 ADB(非强制)
check_adb()
# 检查 web_ui 目录
web_ui_dir = os.path.join(os.path.dirname(os.path.abspath(__file__)), "web_ui")
if not os.path.exists(web_ui_dir):
print(f"\n✗ web_ui 目录不存在: {web_ui_dir}")
sys.exit(1)
# 将 web_ui 和 src 目录添加到 Python 路径
sys.path.insert(0, web_ui_dir)
src_dir = os.path.join(os.path.dirname(os.path.abspath(__file__)), "src")
if os.path.exists(src_dir):
sys.path.insert(0, src_dir)
# 端口配置
target_port = 8868
print(f"\n检查端口 {target_port}...")
kill_port(target_port)
# 启动 Gradio
print("\n正在启动 Web 界面...")
try:
from app import create_ui
demo, css, head = create_ui()
print(f"\n{'=' * 50}")
print(f" 访问地址: http://localhost:{target_port}")
print(f"{'=' * 50}\n")
demo.launch(
server_name="0.0.0.0",
server_port=target_port,
share=False,
inbrowser=True,
show_error=True,
quiet=False,
css=css,
head=head,
allowed_paths=["d:\\maigui\\MAI-UI\\logs"]
)
except ImportError as e:
print(f"\n✗ 导入失败: {e}")
print("请确保 web_ui/app.py 存在且正确")
sys.exit(1)
except Exception as e:
print(f"\n✗ 启动失败: {e}")
import traceback
traceback.print_exc()
sys.exit(1)
if __name__ == "__main__":
main()