2

我有一个 MATLAB .m 文件并希望 Python.py 文件能够运行/调用该 .m 文件,但是 Python 3.9 似乎不支持使用“import matlab.engine”调用 MATLAB 文件(我正在运行) 并在 3.7 之后被削减

我的问题是在 Python 3.9 中调用 MATLAB 脚本的正确约定是什么?

编辑:当我说“调用 MATLAB 脚本”时,我的意思是自己运行脚本。使用 .py 文件打开 MATLAB 窗口有点违背了这个项目的目的。

4

2 回答 2

3

这个答案适用于 Python 3.6,但它也应该适用于 3.9。在 Linux 机器(和 MacOS,可能稍作修改)上,您可以执行系统命令打开 MATLAB,运行您的脚本,然后关闭 MATLAB,

import subprocess

run_matlab = 'matlab -nodisplay -nojvm -nosplash -nodesktop -r "try, test_script, catch e, disp(getReport(e)), exit(1), end, exit(0);"'

subprocess.run(run_matlab, shell=True, check=True)

try-catch块的目的是在执行脚本后正确退出 MATLAB test_script,以防脚本引发异常 - 引发错误。可以改为直接退出(exit或者quit在 MATLAB 中,默认情况下在这两个操作系统上返回正确的退出代码),但是有了try-catch块,就有更多机会在发生异常时修复、通知或保存内容。在交互式会话之外运行时,这通常很有用。

该命令的其余部分打开 MATLAB,不显示任何类型,运行脚本test_script,然后退出 MATLAB -exit(1)表示引发了异常,exit(0)这意味着一切顺利。

没有try-catch命令就简单多了,

run_matlab = 'matlab -nodisplay -nojvm -nosplash -nodesktop -r "test_script; exit;"'

在 Python 方面,我使用subprocess.run()(或.call()),因为它较新,并且推荐使用. 该选项shell表示该命令将通过 shell 执行。check表示如果run_matlab进程(命令)抛出错误,Python 脚本也会抛出错误。默认值是False并且与该try-catch块一起可用于快速忽略崩溃代码。


正如@CrisLuengo 在他的评论中所说,从MATLAB 2019aMATLAB 2018b确实没有)开始,不需要上面详细说明的命令。所有你需要的是

run_matlab = 'matlab -batch test_script.m'

查看文档,-batch调用所有必要的选项等等。

于 2020-12-02T00:03:00.200 回答
0

这更像是一个 hack 修复,但您可以在系统上编辑 matlab 引擎的 Python 包并绕过版本检查器。由于 Python 是向后兼容的,它应该不是问题,具体取决于您的用例。

在您的系统上打开以下文件(或 matlab 引擎下的等效文件):

vim /usr/lib/python3.9/site-packages/matlab/engine/__init__.py

在该文件中,将第 31 行更改为包含 Python 3.9:

_supported_versions = ['2_7', '3_6', '3_7', '3_8', '3_9']

最后,在第 37 行,将版本号更改为有效版本。

    _PYTHONVERSION = '3_7' # or another new, supported version

在此之后,您应该能够像支持 Python 3.9 一样运行 matlab 的引擎。

于 2021-03-04T02:40:32.740 回答