cvpilot-tool/apps/desktop/electron/core/PythonManager.ts

102 lines
2.8 KiB
TypeScript
Raw Normal View History

2024-08-29 16:59:25 +08:00
import http from "node:http";
import path from "node:path";
import { spawn, ChildProcess } from "node:child_process";
import { BrowserWindow } from "electron";
class PythonManager {
public flaskProcess: ChildProcess | null = null;
private intervalId: NodeJS.Timeout | null = null;
constructor(
private mainWindow: BrowserWindow | null,
private url: string,
private interval = 5000
) {}
// 启动 Python 服务
public startFlask() {
if (this.flaskProcess) {
console.log("Flask service is already running.");
this.mainWindow?.webContents.send("flask", { running: true });
return;
}
// 使用 spawn 启动 Flask 服务
this.flaskProcess = spawn(path.join(process.env.VITE_PUBLIC!, "flask_app"));
// 实时获取 stdout 日志
this.flaskProcess.stdout?.on("data", (data) => {
const message = data.toString();
console.log(`Flask stdout: ${message}`);
this.mainWindow?.webContents.send("flask", { stdout: message });
});
// 实时获取 stderr 日志
this.flaskProcess.stderr?.on("data", (data) => {
const message = data.toString();
console.error(`Flask stderr: ${message}`);
this.mainWindow?.webContents.send("flask-service:response", { stderr: message });
});
// 监听进程关闭事件
this.flaskProcess.on("close", (code) => {
console.log(`Flask process exited with code ${code}`);
this.flaskProcess = null;
this.mainWindow?.webContents.send("flask-service:response", { exited: true, code });
});
// 开始轮询服务状态
// this.startCheckingFlaskStatus();
}
// 停止 Python 服务
public stopFlask() {
if (this.flaskProcess) {
this.flaskProcess.kill();
console.log("Flask service stopped.");
this.flaskProcess = null;
}
// 停止轮询
this.stopCheckingFlaskStatus();
}
// 检查 Flask 服务状态
private checkFlaskStatus() {
if (!this.mainWindow) return;
http
.get(this.url, (res) => {
const { statusCode } = res;
this.mainWindow?.webContents.send("flask-check", {
running: statusCode === 200,
});
})
.on("error", (err) => {
console.error(`Error checking Flask service: ${err.message}`);
this.mainWindow?.webContents.send("flask-check", {
running: false,
});
});
}
// 开始轮询 Flask 服务状态
private startCheckingFlaskStatus() {
if (this.intervalId) {
console.log("Already checking Flask status.");
return;
}
this.intervalId = setInterval(() => this.checkFlaskStatus(), this.interval);
}
// 停止轮询 Flask 服务状态
private stopCheckingFlaskStatus() {
if (this.intervalId) {
clearInterval(this.intervalId);
this.intervalId = null;
}
}
}
export default PythonManager;