我有一个 MATLAB .m 文件并希望 Python.py 文件能够运行/调用该 .m 文件,但是 Python 3.9 似乎不支持使用“import matlab.engine”调用 MATLAB 文件(我正在运行) 并在 3.7 之后被削减
我的问题是在 Python 3.9 中调用 MATLAB 脚本的正确约定是什么?
编辑:当我说“调用 MATLAB 脚本”时,我的意思是自己运行脚本。使用 .py 文件打开 MATLAB 窗口有点违背了这个项目的目的。
我有一个 MATLAB .m 文件并希望 Python.py 文件能够运行/调用该 .m 文件,但是 Python 3.9 似乎不支持使用“import matlab.engine”调用 MATLAB 文件(我正在运行) 并在 3.7 之后被削减
我的问题是在 Python 3.9 中调用 MATLAB 脚本的正确约定是什么?
编辑:当我说“调用 MATLAB 脚本”时,我的意思是自己运行脚本。使用 .py 文件打开 MATLAB 窗口有点违背了这个项目的目的。
这个答案适用于 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 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
在此之后,您应该能够像支持 Python 3.9 一样运行 matlab 的引擎。