#!/usr/bin/env python3 """ AI Agent 启动与管理脚本 - Python版 用法: python tools/testrun.py [check|backend|frontend|both] """ import sys import os import time import signal import subprocess from pathlib import Path from dotenv import load_dotenv # 路径设置 project_root = Path(__file__).resolve().parent.parent sys.path.insert(0, str(project_root)) load_dotenv(project_root / ".env") # 全局变量 processes = [] def start_backend(): """启动后端服务""" print("\n🚀 启动后端服务 (端口 8079)...") env = os.environ.copy() env["PYTHONPATH"] = str(project_root / "backend") env["BACKEND_PORT"] = "8079" proc = subprocess.Popen( [sys.executable, "-m", "app.backend"], cwd=str(project_root), env=env ) processes.append(proc) print(f"✓ 后端服务已启动 (PID: {proc.pid})") time.sleep(2) return proc def start_frontend(): """启动前端服务""" print("\n🎨 启动前端界面 (端口 10501)...") env = os.environ.copy() env["PYTHONPATH"] = str(project_root / "frontend/src") env["API_URL"] = "http://127.0.0.1:8079/chat" frontend_main = str(project_root / "frontend" / "src" / "frontend_main.py") proc = subprocess.Popen( [ sys.executable, "-m", "streamlit", "run", frontend_main, "--server.port", "10501", "--server.address", "0.0.0.0" ], cwd=str(project_root), env=env ) processes.append(proc) print(f"✓ 前端服务已启动 (PID: {proc.pid})") print("✓ 访问地址:") print(" 本地开发: http://127.0.0.1:10501") return proc def cleanup(signum, frame): """清理函数 - 停止所有进程""" print("\n🛑 正在停止服务...") for i, proc in enumerate(processes): if proc.poll() is None: # 进程还在运行 proc.terminate() proc.wait(timeout=5) print(f"✓ 服务 {i+1} 已停止") sys.exit(0) def print_help(): """显示帮助信息""" print("========================================") print(" AI Agent - 个人生活助手") print("========================================") print("\n用法: python tools/testrun.py [command]") print("\n命令:") print(" backend 仅启动后端服务") print(" frontend 仅启动前端服务") print(" both 启动前后端服务(默认)") print(" help 显示此帮助信息") print("\n示例:") print(" python tools/testrun.py both # 启动本地开发环境") def main(): """主函数""" print("========================================") print(" AI Agent - 个人生活助手") print("========================================") # 捕获信号 signal.signal(signal.SIGINT, cleanup) signal.signal(signal.SIGTERM, cleanup) cmd = sys.argv[1] if len(sys.argv) > 1 else "both" if cmd == "backend": start_backend() print("\n后端服务正在运行,按 Ctrl+C 停止") processes[0].wait() elif cmd == "frontend": start_frontend() print("\n前端服务正在运行,按 Ctrl+C 停止") processes[0].wait() elif cmd == "both": start_backend() time.sleep(3) start_frontend() print("\n所有服务正在运行,按 Ctrl+C 停止") for proc in processes: proc.wait() else: print_help() if __name__ == "__main__": main()