From a9c2e7e32d1b18e01c91017481bb762d2f051fab Mon Sep 17 00:00:00 2001 From: Tian jianyong <11429339@qq.com> Date: Thu, 25 Sep 2025 17:19:21 +0800 Subject: [PATCH] =?UTF-8?q?=E5=A2=9E=E5=8A=A0mock=20=E6=9C=8D=E5=8A=A1?= =?UTF-8?q?=E9=9C=80=E8=A6=81=E7=9A=84=20python=20=E5=8C=85=E4=B8=8B?= =?UTF-8?q?=E8=BD=BD=E5=AE=89=E8=A3=85=E6=96=B9=E6=A1=88?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .gitignore | 5 +- deploy/python-dependencies-offline.md | 255 ++++++++++++++++++ ...sal_autonomous_vehicle_api_min_required.md | 2 +- tools/mock_airport.py | 1 - tools/mock_traffic_light.py | 1 - tools/mock_unmanned_vehicle.py | 1 - 6 files changed, 260 insertions(+), 5 deletions(-) create mode 100644 deploy/python-dependencies-offline.md diff --git a/.gitignore b/.gitignore index 4b321ec6..a1b1bb8e 100644 --- a/.gitignore +++ b/.gitignore @@ -42,6 +42,8 @@ logs/ *.log *.xml.versionsBackup *.swp +*.tar +*.tar.gz !*/build/*.java !*/build/*.html @@ -51,4 +53,5 @@ logs/ .vscode/ Users/ -qaup-deploy/ \ No newline at end of file +qaup-deploy/ +deploy/offline_packages/ \ No newline at end of file diff --git a/deploy/python-dependencies-offline.md b/deploy/python-dependencies-offline.md new file mode 100644 index 00000000..97f46e61 --- /dev/null +++ b/deploy/python-dependencies-offline.md @@ -0,0 +1,255 @@ +# Python依赖库离线部署指南 + +本文档提供了 QAUP-Management 项目中 tools 目录下 Python 脚本的离线部署指南。 + +## 📋 概述 + +通过对 tools 目录下 4 个 Python 文件的依赖分析,除了 Flask 之外,还需要安装以下外部库用于完整功能支持。 + +## 📂 分析的文件 + +- `tools/mock_airport.py` - 机场管理系统模拟服务 +- `tools/mock_traffic_light.py` - 红绿灯设备模拟器 +- `tools/mock_unmanned_vehicle.py` - 无人车厂商平台模拟服务 +- `tools/aircraft_routes_from_api.py` - 航空器路由数据定义 + +## 📦 依赖库清单 + +### 🚀 必需的外部库 + +| 库名 | 用途 | 使用文件 | 关键功能 | +|-----|------|---------|----------| +| **Flask** | Web服务框架 | 所有mock_*.py文件 | API服务、HTTP路由 | +| **pyproj** | 坐标系转换 | mock_airport.py | CGCS2000↔WGS84精确转换 | +| **Shapely** | 几何操作 | mock_airport.py | 路径合并(linemerge)、几何计算 | + +### 📚 内置库(无需安装) + +以下库为 Python 标准库,无需额外安装: +``` +time, math, logging, os, threading, atexit, socket, json, +argparse, datetime, signal, typing, collections.abc, copy +``` + +### 🔄 回退机制 + +- **pyproj**: 不可用时自动回退到简化坐标转换算法 +- **Shapely**: 不可用时跳过路径合并,基本功能仍可用 + +## 🛠️ 离线部署步骤 + +### 步骤1:在联网机器上下载依赖包 + +```bash +# 创建依赖包目录 +mkdir offline_packages +cd offline_packages + +# 下载所有依赖包(包含依赖的依赖) +pip download Flask pyproj Shapely + +# 或者如果有requirements.txt +pip download -r ../requirements.txt +``` + +### 步骤2:打包传输 + +```bash +# 打包下载的文件 +tar -czf python_packages.tar.gz offline_packages/ + +# 传输到离线机器 +scp python_packages.tar.gz user@offline-server:/path/to/destination/ +``` + +### 步骤3:在离线机器上安装 + +```bash +# 解压依赖包 +tar -xzf python_packages.tar.gz + +# 离线安装 +pip install --find-links ./offline_packages --no-index Flask pyproj Shapely + +# 或者如果有requirements.txt +pip install --find-links ./offline_packages --no-index -r requirements.txt +``` + +## ✅ 安装验证 + +### 验证脚本 + +创建 `test_dependencies.py` 文件: + +```python +#!/usr/bin/env python3 +""" +依赖库安装验证脚本 +""" +import sys + +def test_imports(): + """测试所有必需库的导入""" + success = True + + # 测试基础库 + try: + import flask + print("✅ Flask: OK") + except ImportError as e: + print(f"❌ Flask: FAILED - {e}") + success = False + + # 测试坐标转换库 + try: + import pyproj + print("✅ pyproj: OK") + except ImportError as e: + print(f"⚠️ pyproj: MISSING - 将使用简化坐标转换算法") + + # 测试几何库 + try: + import shapely + print("✅ Shapely: OK") + except ImportError as e: + print(f"⚠️ Shapely: MISSING - 路径合并功能将被跳过") + + # 测试标准库 + standard_libs = [ + 'time', 'math', 'logging', 'os', 'threading', 'atexit', + 'socket', 'json', 'argparse', 'datetime', 'signal', 'typing' + ] + + for lib in standard_libs: + try: + __import__(lib) + except ImportError as e: + print(f"❌ {lib}: FAILED - {e}") + success = False + + print("✅ 所有标准库: OK") + + return success + +def test_functionality(): + """测试关键功能""" + print("\n🧪 测试关键功能...") + + # 测试坐标转换 + try: + from pyproj import CRS, Transformer + wgs84_crs = CRS.from_epsg(4326) + print("✅ 坐标系转换功能: OK") + except ImportError: + print("⚠️ 坐标系转换功能: 使用简化算法") + except Exception as e: + print(f"❌ 坐标系转换功能: ERROR - {e}") + + # 测试几何操作 + try: + from shapely.geometry import LineString + from shapely.ops import linemerge + lines = [LineString([(0,0), (1,1)]), LineString([(1,1), (2,2)])] + merged = linemerge(lines) + print("✅ 几何操作功能: OK") + except ImportError: + print("⚠️ 几何操作功能: 路径合并将被跳过") + except Exception as e: + print(f"❌ 几何操作功能: ERROR - {e}") + +if __name__ == "__main__": + print("🔍 验证Python依赖库安装...") + print("=" * 50) + + if test_imports(): + print("\n✅ 核心依赖库验证通过") + test_functionality() + print("\n🎉 系统准备就绪,可以运行tools目录下的Python脚本") + sys.exit(0) + else: + print("\n❌ 依赖库验证失败,请检查安装") + sys.exit(1) +``` + +运行验证: +```bash +python test_dependencies.py +``` + +## 📄 requirements.txt + +建议创建 `requirements.txt` 文件: + +```txt +# QAUP-Management Tools Dependencies +Flask>=2.0.0 +pyproj>=3.0.0 +Shapely>=1.8.0 +``` + +## 🔧 故障排除 + +### 常见问题 + +1. **pyproj 安装失败** + ```bash + # 可能需要系统级依赖 + # Ubuntu/Debian + sudo apt-get install libproj-dev proj-data proj-bin + + # CentOS/RHEL + sudo yum install proj-devel + ``` + +2. **Shapely 安装失败** + ```bash + # 可能需要 GEOS 库 + # Ubuntu/Debian + sudo apt-get install libgeos-dev + + # CentOS/RHEL + sudo yum install geos-devel + ``` + +3. **权限问题** + ```bash + # 使用用户安装 + pip install --user --find-links ./offline_packages --no-index Flask pyproj Shapely + ``` + +### 验证服务启动 + +```bash +# 测试启动各个模拟服务 +cd tools + +# 机场管理服务 (端口8090) +python3 mock_airport.py + +# 红绿灯模拟器 (端口8082) +python3 mock_traffic_light.py + +# 无人车平台服务 (端口8091) +python3 mock_unmanned_vehicle.py +``` + +## 📝 注意事项 + +1. **Python版本**: 建议使用Python 3.7+ +2. **网络隔离**: 确保 `--no-index` 参数防止联网下载 +3. **依赖版本**: 固定版本号避免兼容性问题 +4. **回退机制**: pyproj和Shapely不可用时会自动降级,基本功能仍可用 +5. **日志目录**: 确保运行目录有写权限创建logs目录 + +## 🆘 技术支持 + +如果遇到安装问题: + +1. 检查Python版本: `python --version` +2. 检查pip版本: `pip --version` +3. 运行验证脚本: `python test_dependencies.py` +4. 查看错误日志: `logs/mock_server.log` + +--- +*文档生成时间: 2024年* +*适用于: QAUP-Management 项目 tools 目录* \ No newline at end of file diff --git a/doc/requirement/universal_autonomous_vehicle_api_min_required.md b/doc/requirement/universal_autonomous_vehicle_api_min_required.md index d147ed64..1a5298bd 100644 --- a/doc/requirement/universal_autonomous_vehicle_api_min_required.md +++ b/doc/requirement/universal_autonomous_vehicle_api_min_required.md @@ -1,4 +1,4 @@ -# 通用无人车运行状态API(上报必须字段 - 精简版) +# 通用无人车运行状态API(测试版) 本说明仅包含机场部署必须按时上报的最小字段集合,便于联调与验收。完整可选字段请参见《无人车通用运行状态API接口》。本文件已包含完整的请求方式与可运行示例,使用本文件即可进行开发与测试。 diff --git a/tools/mock_airport.py b/tools/mock_airport.py index fb5094ad..b6867e44 100644 --- a/tools/mock_airport.py +++ b/tools/mock_airport.py @@ -3,7 +3,6 @@ import time import math import logging import os -import uuid import threading import atexit from typing import Any, Literal, final, TypedDict diff --git a/tools/mock_traffic_light.py b/tools/mock_traffic_light.py index a31f014d..d838b36f 100644 --- a/tools/mock_traffic_light.py +++ b/tools/mock_traffic_light.py @@ -13,7 +13,6 @@ import socket import time import json import argparse -import sys from datetime import datetime import signal from typing import TypedDict diff --git a/tools/mock_unmanned_vehicle.py b/tools/mock_unmanned_vehicle.py index 70de8ae7..60edb68a 100644 --- a/tools/mock_unmanned_vehicle.py +++ b/tools/mock_unmanned_vehicle.py @@ -13,7 +13,6 @@ import time import math import logging import os -import uuid from typing import Any, Literal, final, TypedDict # 创建 logs 目录(如果不存在)