using System.Diagnostics; namespace Hawkeye.VisionBuilder.Workflow.DataTransfer; public class WslScriptRunner { private Process process; private readonly string _pythonPath; private string scriptPath; private readonly string _workingDirectory; public WslScriptRunner(string pythonPath, string scriptPath,string workingDirectory) { _pythonPath = pythonPath; this.scriptPath = scriptPath; _workingDirectory = workingDirectory; } public static string ConvertToWslPath(string windowsPath) { if (string.IsNullOrWhiteSpace(windowsPath)) throw new ArgumentException("Path cannot be null or empty.", nameof(windowsPath)); // Replace backslashes with forward slashes string wslPath = windowsPath.Replace('\\', '/'); // Extract the drive letter and convert it to WSL format if (wslPath.Length > 1 && wslPath[1] == ':') { char driveLetter = char.ToLower(wslPath[0]); wslPath = $"/mnt/{driveLetter}{wslPath.Substring(2)}"; } return wslPath; } public void Start() { //startInfo.CreateNoWindow = true; // create and start the process process = new Process(); var arg = $@"--distribution ubuntu --user root --cd ""{ConvertToWslPath(_workingDirectory)}"" -- /root/ai3/bin/python3 ""{ConvertToWslPath(scriptPath)}"""; process.StartInfo = new ProcessStartInfo("wsl",arg) { UseShellExecute = false }; process.Start(); // on windows only if(Environment.OSVersion.Platform == PlatformID.Win32NT) ChildProcessTracker.AddProcess(process); } public void Stop() { if (process != null && !process.HasExited) { process.Kill(); process.Dispose(); process = null; } } }