从 Python 运行 Matlab 脚本时在 Python 中检测错误并引发标志

Posted

技术标签:

【中文标题】从 Python 运行 Matlab 脚本时在 Python 中检测错误并引发标志【英文标题】:Detect an error and raise flag in Python when running an Matlab script from Python 【发布时间】:2021-12-29 21:24:43 【问题描述】:

我有一个从 Python 运行的 Matlab 脚本。我想检测我的 Matlab 脚本中发生的任何错误并在 Python 中引发一个标志(例如e = "error message from Matlab"print(e)if error_in_matlab: e=1)。这是我运行yyy.m matlab 脚本的简化代码:

import os
path_to_mfile = '/Users/folder/yyy'
matlabCommandStr = 'matlab -nodisplay -r "clear all; close all; run(\'\'); quit" '.format(path_to_mfile)

while True:
    try:
        os.system(matlabCommandStr)
    except Exception as e:
        print(e)
        error_flag = 1
        break

我知道如果我在 Python 中使用 Matlab 工具箱,下面的代码会起作用:

import matlab.engine
while True:
    try:
        eng = matlab.engine.start_matlab()
        ret = eng.yyy()
    except Exception as e:
        print(e)
        error_flag = 1
        break

但是由于matlab.engine的限制,我需要使用命令行,而我正在准备的工具箱已经足够复杂,可以更改为matlab.engine,所以我想继续使用os.system(matlabCommandStr)。如果有人可以提供帮助,我将不胜感激。

【问题讨论】:

我建议您使用-batch 选项而不是-nodisplay -r。您不需要quit,也不需要捕获错误。 clearclose 命令总是没用,您正在开始一个新的 MATLAB 会话,没有什么要清除,也没有什么要关闭。 如果您使用matlab.engine,您不会通过os.system 调用MATLAB,这就是重点。它也是在 Python 中捕获错误并处理它们的唯一方法。如果您不想使用该引擎,请使用 subprocess 模块以使用 -batch 选项启动 MATLAB,并解析 stderr 输出。它不如 MATLAB 引擎方便,但你可以让它工作。 感谢@CrisLuengo,我将-nodisplay -r 替换为-batch,并将状态添加到命令行代码中,例如status = os.system(matlabCommandStr),这很有帮助。没有错误时返回0,有错误时返回status = 256。所以现在我使用256 作为我的错误标志,到目前为止它似乎正在工作。我应该开始一个更大的过程,看看这是否适用于我们管道的其他部分。再次感谢! 【参考方案1】:

使用@CrisLuengo 回答中的提示,我使用-batch 而不是-nodisplay -r,然后当出现错误status = 256 并且如果没有发生错误则status = 0。我用它作为检测错误的标志。以下代码帮助我解决了这个问题:

import os
path_to_mfile = '/Users/folder/yyy'
matlabCommandStr = 'matlab -batch "run(\'\'); quit" '.format(path_to_mfile)

while True:
    status = os.system(matlabCommandStr)
    if status == 256:
        error_flag = 1

我会将它集成到我的多进程工具中。如果还有问题,我会在这里更新。

【讨论】:

很高兴它有效!我会使用 subprocess 来启动 MATLAB。这样您就可以捕获stderr 并实际处理错误消息。此外,您不需要 quit-batch

以上是关于从 Python 运行 Matlab 脚本时在 Python 中检测错误并引发标志的主要内容,如果未能解决你的问题,请参考以下文章

从 python 运行 MATLAB 脚本 + 传递参数

从 Python 运行 Matlab 脚本:TypeError: 'float' object is not iterable

从 MATLAB Compiler 应用程序调用 python 时无法调用 python 库

Matlab 调用 Python 脚本

如何在MATLAB中调用(运行)“用Python写成的函数或脚本”

无法在 Windows/MSYS2 下从 bash 脚本运行 MATLAB