【发布时间】: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作为我的错误标志,到目前为止它似乎正在工作。我应该开始一个更大的过程,看看这是否适用于我们管道的其他部分。再次感谢!
标签: python matlab error-handling multiprocessing