#!/usr/bin/env python3 # -*- coding: utf-8 -*- """ 自动安装脚本 自动安装所需依赖并验证环境 """ import subprocess import sys import time import os def print_header(title): """打印标题""" print("\n" + "=" * 60) print(f" {title}") print("=" * 60) def run_command(command, description): """运行命令并显示结果""" print(f"\n🔄 {description}...") try: result = subprocess.run(command, shell=True, capture_output=True, text=True) if result.returncode == 0: print(f"✅ {description} 成功完成") return True else: print(f"❌ {description} 失败") print(f"错误信息: {result.stderr}") return False except Exception as e: print(f"❌ {description} 执行异常: {e}") return False def check_python_version(): """检查Python版本""" print_header("检查Python版本") version = sys.version_info print(f"当前Python版本: {version.major}.{version.minor}.{version.micro}") if version.major < 3 or (version.major == 3 and version.minor < 8): print("❌ Python版本过低,需要Python 3.8或更高版本") return False else: print("✅ Python版本满足要求") return True def install_requirements(): """安装依赖包""" print_header("安装依赖包") if not os.path.exists("requirements.txt"): print("❌ requirements.txt 文件不存在") return False # 升级pip if not run_command(f"{sys.executable} -m pip install --upgrade pip", "升级pip"): print("⚠️ pip升级失败,继续安装依赖") # 安装基础依赖 success1 = run_command(f"{sys.executable} -m pip install -r requirements.txt", "安装基础依赖包") # 安装Flask(Web功能所需) success2 = install_flask() return success1 and success2 def install_flask(): """安装Flask及其依赖""" print("\n🔧 安装Flask(Web功能支持)...") try: # 检查是否已安装 import flask print(f"✅ Flask已安装,版本: {flask.__version__}") return True except ImportError: pass # 尝试使用清华镜像源 result = subprocess.run([ sys.executable, "-m", "pip", "install", "flask==2.3.3", "-i", "https://pypi.tuna.tsinghua.edu.cn/simple/", "--trusted-host", "pypi.tuna.tsinghua.edu.cn" ], capture_output=True, text=True, timeout=300) if result.returncode == 0: print("✅ Flask安装成功!") return True else: # 尝试官方源 result = subprocess.run([ sys.executable, "-m", "pip", "install", "flask==2.3.3" ], capture_output=True, text=True, timeout=300) if result.returncode == 0: print("✅ Flask安装成功!") return True else: print(f"❌ Flask安装失败: {result.stderr}") return False def verify_installation(): """验证安装""" print_header("验证安装") modules_to_check = [ ("cv2", "OpenCV"), ("numpy", "NumPy"), ("ultralytics", "Ultralytics"), ("torch", "PyTorch"), ("flask", "Flask"), ] all_success = True for module, name in modules_to_check: try: __import__(module) print(f"✅ {name} 安装成功") except ImportError: print(f"❌ {name} 安装失败") all_success = False return all_success def download_yolo_model(): """预下载YOLO模型""" print_header("下载YOLO模型") try: from ultralytics import YOLO print("🔄 正在下载YOLOv8n模型,请稍候...") model = YOLO('yolov8n.pt') print("✅ YOLOv8n模型下载成功") # 测试模块结构 try: from src import PersonDetector, DistanceCalculator print("✅ 重构后的模块结构测试成功") except ImportError as e: print(f"⚠️ 模块结构测试失败: {e}") return True except Exception as e: print(f"❌ YOLO模型下载失败: {e}") return False def run_test(): """运行测试""" print_header("运行系统测试") if os.path.exists("test_modules.py"): return run_command(f"{sys.executable} test_modules.py", "运行系统测试") else: print("⚠️ 测试脚本不存在,跳过测试") return True def create_desktop_shortcut(): """创建桌面快捷方式(Windows)""" try: import platform if platform.system() == "Windows": print_header("创建桌面快捷方式") desktop_path = os.path.join(os.path.expanduser("~"), "Desktop") if os.path.exists(desktop_path): shortcut_content = f""" @echo off cd /d "{os.getcwd()}" python run.py pause """ shortcut_path = os.path.join(desktop_path, "人体距离检测.bat") with open(shortcut_path, "w", encoding="gbk") as f: f.write(shortcut_content) print(f"✅ 桌面快捷方式已创建: {shortcut_path}") return True else: print("⚠️ 未找到桌面路径") return False except Exception as e: print(f"⚠️ 创建快捷方式失败: {e}") return False def main(): """主安装函数""" print("🚀 人体距离检测系统 - 自动安装程序") print("此程序将自动安装所需依赖并配置环境") steps = [ ("检查Python版本", check_python_version), ("安装依赖包", install_requirements), ("验证安装", verify_installation), ("下载YOLO模型", download_yolo_model), ("运行系统测试", run_test), ] # 可选步骤 optional_steps = [ ("创建桌面快捷方式", create_desktop_shortcut), ] print(f"\n📋 安装计划:") for i, (name, _) in enumerate(steps, 1): print(f" {i}. {name}") print(f"\n可选步骤:") for i, (name, _) in enumerate(optional_steps, 1): print(f" {i}. {name}") input("\n按Enter键开始安装...") start_time = time.time() success_count = 0 total_steps = len(steps) # 执行主要安装步骤 for i, (name, func) in enumerate(steps, 1): print(f"\n📦 步骤 {i}/{total_steps}: {name}") if func(): success_count += 1 print(f"✅ 步骤 {i} 完成") else: print(f"❌ 步骤 {i} 失败") # 询问是否继续 choice = input("是否继续安装?(y/n): ").lower() if choice != 'y': print("安装已取消") return # 执行可选步骤 for name, func in optional_steps: choice = input(f"\n是否执行: {name}?(y/n): ").lower() if choice == 'y': func() # 显示安装结果 elapsed_time = time.time() - start_time print_header("安装完成") print(f"✅ 安装步骤: {success_count}/{total_steps} 完成") print(f"⏱️ 总耗时: {elapsed_time:.1f}秒") if success_count == total_steps: print("🎉 所有步骤都已成功完成!") print("\n📖 使用指南:") print(" 1. 运行 'python run.py' 启动系统") print(" 2. 选择运行模式(Web或传统模式)") print(" 3. 如需配置摄像头位置,运行 setup_camera_location.py") print(" 4. 如遇问题,运行 test_modules.py 进行诊断") else: print("⚠️ 部分步骤未成功,请检查错误信息") print("💡 如需帮助,请查看README.md文档") print("\n安装程序结束!") if __name__ == "__main__": main()