fix(server): worktree 启动时 ECAT_DIR 回指主检出 tools/ecat

从 .worktrees/<slug> 跑 esp32_server 时 join(BASE_DIR,'..','ecat') 会拼成
.worktrees/ecat,找不到 ecat_native.exe。先走出 .worktrees 再取兄弟目录。
This commit is contained in:
cbb
2026-09-16 12:19:55 +08:00
parent 0629bf0910
commit 4b4559e772
2 changed files with 72 additions and 1 deletions
+15 -1
View File
@@ -157,7 +157,21 @@ g_ecat_port = None # 记住上次探到的端口, 避免每次请求都从 809
# 2) 拉起时**必须带 --parent-pid**: 让 native 在本服务退出后自我了断,
# 不留孤儿进程占着 Npcap 适配器和端口。
# 3) 不再需要 venv/pythonw —— 单文件 exe, 无 Python 运行时依赖。
ECAT_DIR = os.path.normpath(os.path.join(BASE_DIR, "..", "ecat"))
def _resolve_ecat_dir(base_dir):
"""定位 tools/ecat(ecat_native.exe 的仓库,与本仓库平级)。
从 git worktree(.../tools/ESP32/.worktrees/<slug>)启动时,BASE_DIR 的
上一级是 .worktrees 而不是 tools,直接 join("..","ecat") 会拼成
.../ESP32/.worktrees/ecat,找不到 exe。先走回主检出再取兄弟目录。
"""
d = os.path.abspath(base_dir)
parent = os.path.dirname(d)
if os.path.basename(parent) == ".worktrees":
d = os.path.dirname(parent) # → .../tools/ESP32 主检出
return os.path.normpath(os.path.join(d, "..", "ecat"))
ECAT_DIR = _resolve_ecat_dir(BASE_DIR)
ECAT_NATIVE_EXE = os.path.join(ECAT_DIR, "build_native", "ecat_native.exe")
g_ecat_child = None # 由本服务拉起的 ecat 服务子进程(复用已有实例时为 None)
g_ecat_log_fp = None # native stdout 落盘句柄(见 _ecat_autostart 内注释)