如何在 Python 3.9 中调用 MATLAB 脚本?

How to call a MATLAB Script in Python 3.9?

我有一个 MATLAB .m 文件并希望 Python.py 文件能够 run/call 那个 .m 文件,但是使用 'import matlab.engine' 调用 MATLAB 文件似乎不是在 Python 3.9 中支持(什么是我 运行ning)并在 3.7

之后被删除

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

编辑:当我说 'call a MATLAB script' 时,我的意思是 运行 脚本本身。使用 .py 文件打开 MATLAB window 有点违背了这个项目的目的。

此答案适用于 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 块的目的是在执行脚本 test_script 后正确退出 MATLAB,以防脚本引发异常 - 抛出错误。可以改为直接退出(exitquit in MATLAB returns 默认情况下这两个 OS 上的正确退出代码),但是有一个 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())因为它较新,而recommended。选项 shell 表示命令将通过 shell 执行。 check 表示如果 run_matlab 进程(命令)抛出一个错误,Python 脚本也会抛出一个错误。默认值为 False 并且与 try-catch 块一起可用于快速忽略崩溃代码。


正如@CrisLuengo 在他的评论中所说,以 MATLAB 2019a (MATLAB 2018b 开头确实没有)不需要上面详细说明的命令。您只需要

run_matlab = 'matlab -batch test_script.m'

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

这更像是一个 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

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