/// <summary> /// //调用py;获得结果参数文件路径; /// </summary> /// <param name="outPutXDocPath">输出参数文件路径</param> /// <param name="pyName"></param> /// <returns>输出相对路径以及参数文件的路径</returns> public static (string outPutPath, string outDocName) GetProcessOutPut(AndroidDeviceCaseFile CaseFile, string pyName) { var guid = Guid.NewGuid().ToString("N"); var outPutPath = $"{SingularityCase.Current.Path}/{CaseFile.BasePath}/{guid}"; var outPutDocName = "output.xml"; if (!System.IO.Directory.Exists(outPutPath)) { System.IO.Directory.CreateDirectory(outPutPath); } //生成参数文件; var xDoc = new XDocument(); //文件范围相关; var rootElem = new XElement("Params"); var rangesXDoc = CaseFile.BuildFilesDoc(saveAllFiles: false); var FileRangesXDoc = $"{outPutPath}/new.xml"; var outPutXDocPath = $"{outPutPath}/{outPutDocName}"; rangesXDoc.Save(FileRangesXDoc); //其它参数; rootElem.Add(new XElement("GUID", guid)); rootElem.Add(new XElement("type", "SingleImg")); rootElem.Add(new XElement("ImgPath", CaseFile.InterLabel)); rootElem.Add(new XElement(nameof(FileRangesXDoc), FileRangesXDoc)); rootElem.Add(new XElement("OutPutXDocPath", outPutXDocPath)); rootElem.Add(new XElement("OutPutPath", outPutPath)); xDoc.Add(rootElem); //流输入控制; StreamWriter iw = null; try { var argPath = $"{outPutPath}/read.xml"; xDoc.Save(argPath); var parser = PythonHelper.GetProcess(pyName, argPath); parser.OutputDataReceived += (sender, e) => { //确定是否是请求文件; if (e.Data?.StartsWith(request_file) == true) { #if DEBUG Console.WriteLine("Request:" + e.Data); #endif //获得文件相对于设备本身的路径; var requestFile = e.Data.Substring(request_file.Length + 1); var requestPath = requestFile.Substring(0, requestFile.LastIndexOf("/")); var file = CaseFile.Data.GetFileByUrl(requestFile); if (file is RegularFile regFile) { using (var stream = regFile.GetStream()) { Stream targetStream = null; try { if (!System.IO.Directory.Exists($"{outPutPath}/{requestPath}")) { System.IO.Directory.CreateDirectory($"{outPutPath}/{requestPath}"); } targetStream = File.Create($"{outPutPath}/{requestFile}"); stream.CopyTo(targetStream); targetStream.Close(); iw.WriteLine("True"); } catch { iw.WriteLine("False"); } } } else { Logger.WriteCallerLine($"Error:Invalid file type:{e.Data}"); } } else { Console.WriteLine("Unknown output:" + e.Data); } }; parser.ErrorDataReceived += (sender, e) => { Logger.WriteLine($"{nameof(AdvPythonHelper)}->{nameof(GetProcessOutPut)}:{e.Data}"); #if DEBUG Console.WriteLine(e.Data); #endif }; parser.Start(); //重定向相关; parser.BeginOutputReadLine(); parser.BeginErrorReadLine(); iw = parser.StandardInput; parser.WaitForExit(); parser.Dispose(); return(outPutPath, outPutDocName); } catch (Exception ex) { Logger.WriteLine($"{nameof(AdvPythonHelper)}->{nameof(GetProcessOutPut)}:{ex.Message}"); throw; } }