【发布时间】:2021-02-05 17:36:59
【问题描述】:
上下文
我正在使用来自 Matlab 的 .Net System.Diagnostic.Process 对象运行,没有任何弹出控制台窗口,我将一些外部处理实时重定向到 matlab 控制台(或任何 matlab未来的进度-gui)。
要运行的程序是一个.bat 文件,它本身运行一个python 脚本(preprocessing.py),最终在内部调用一个可执行文件(processing.exe)。
到目前为止,一切正常,包括 stdout/stderr 的重定向,除了尝试在 matlab 端停止执行(使用ctrl+c)时,我可以从任务管理器中看到对Process.Kill() 的调用不会停止也不会停止python引擎(python.exe)和python脚本(processing.exe)的可执行调用。然后我的 matlab 脚本被阻止在 Process.WaitForExit() 中,直到我从任务管理器中手动杀死 python.exe 或 processing.exe。
为什么在 .bat 文件上运行的初始 System.Diagnostic.Process 上的 Kill() 方法不会杀死其他子进程并使我锁定在 WaitForExit 中? ...我可以强制终止 processing.exe,但它很脏(我不应该知道任何可能启动的子进程)。
matlab 代码
基本上我的matlab代码是这样的:
function [] = main(guicallbacks)
%[
% Init process
process = System.Diagnostic.Process();
process.StartInfo.Filename = 'Processing.bat';
process.StartInfo.CreateNoWindow = true;
process.UseShellExecute = false;
process.RedirectStandardOutput = true;
process.RedirectStandardError = true;
% Attach to process events
l = event.listener(process, 'OutputDataReceived', @onStdOut); l.Recursive = true;
l = event.listener(process, 'ErrorDataReceived', @onStdErr); l.Recursive = true;
% Start process
Start(process);
cuo = onCleanup(@()stopProcess(process));
process.BeginOutputReadLine();
process.BeginErrorReadLine();
% Wait for process
canceled = false;
while (~double(process.HasExited))
% Check for cancellation (progress gui, etc...)
canceled = guicallbacks.IsCancelPending();
if (canceled), break; end
% Wait
pause(1.0);
end
% Check stop reason
if (canceled), error('System:OperationCanceledException', 'User cancelation'); end
if (double(process.ExitCode) ~= 0), error('Process failed (ExitCode = %i)', double(process.ExitCode)); end
%]
end
function [] = onStopProcess(process)
%[
if (double(process.HasExited())), return; end
process.Kill();
process.WaitForExit();
%]
end
function [] = onStdOut(varargin)
%[
cprintf('blue', char(varargin{2}.Data));
%]
end
function [] = onStdErr(varargin)
%[
cprintf('red', char(varargin{2}.Data));
%]
.bat 文件
基本上,除了设置一些环境变量之外,要调用的.bat 文件如下所示:
python.exe -u preprocessing.py
python 脚本
python脚本调用final processing.exe这样执行:
subprocess.call("processsing.exe");
【问题讨论】:
-
This 可能会有所帮助。
-
@rahnema1 非常感谢您的指点。调整在 matlab 中枚举 .net 对象的公认答案,这就像一个魅力
标签: python .net matlab batch-file system.diagnostics