如何在 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,以防脚本引发异常 - 抛出错误。可以改为直接退出(exit
或 quit
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 受到支持一样。
我有一个 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,以防脚本引发异常 - 抛出错误。可以改为直接退出(exit
或 quit
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 受到支持一样。