从 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
,也不需要捕获错误。 clear
和 close
命令总是没用,您正在开始一个新的 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 脚本:TypeError: 'float' object is not iterable
从 MATLAB Compiler 应用程序调用 python 时无法调用 python 库