无法在 Windows/MSYS2 下从 bash 脚本运行 MATLAB

Posted

技术标签:

【中文标题】无法在 Windows/MSYS2 下从 bash 脚本运行 MATLAB【英文标题】:Cannot run MATLAB from bash script under Windows/MSYS2 【发布时间】:2019-09-17 15:12:01 【问题描述】:

我需要从 Python 脚本运行 MATLAB 脚本。我不关心它的输出,也不需要给它任何参数。

但是,MATLAB R2016B 的“引擎”不支持 Python 3.7(此时升级 Matlab 或降级 python 不是一个选项)

所以,我决定制作一个运行它的 shell 脚本:

#!matlab -nodisplay -nodesktop -r 'try; myMatlabScript; catch; end; quit'

现在我需要从 Python 运行一个 bash 脚本。为此,我做了:

import subprocess
subprocess.call("./mybashscript.sh")

(是的,python 脚本与 shell 脚本处于同一级别)

python 脚本不会直接抱怨。但是,我确实得到以下信息:

'.'未被识别为内部或外部命令、可运行程序或批处理文件。

这对我来说意味着由于 Windows 没有直接的 bash,它不知道如何处理这个 shell 脚本。我不确定如何处理。有什么方法可以告诉 Python 使用 MSYS 而不是 Windows 作为 shell?

因此 MATLAB 脚本似乎根本没有运行。

当我在 Linux 下尝试时(只是为了测试,出于性能原因我不能在这里运行它),我得到:

./mybashscript.sh: matlab: bad interpreter: 没有这样的文件或目录

这可能是因为我没有执行命令addpath(genpath('.'))吗?如果是这样,我不确定如何在 shell 脚本中执行此操作,我们将不胜感激。

或者其他更好的解决方案也很好。

【问题讨论】:

【参考方案1】:

1:需要将mybashscript.sh 重命名为mybashscript.bat

2:需要将子进程调用更改为subprocess.call("mybashscript.bat")(因为./ 混淆了windows shell)

3:需要正确添加路径。这是批处理脚本的样子:

matlab -nodisplay -nodesktop -r "addpath(genpath('C:/path/to/myscript')); myMatlabScript"

双引号是必需的,因此 genpath 中的单引号不会导致它提前结束。

就是这样!

编辑:您可以在批处理文件中添加 -wait 以使脚本等待它完成,然后再返回给 Python 脚本。

【讨论】:

你也可以执行 `-r "run('C:/path/to/myscript/myMatlabScript')"。 @CrisLuengo 谢谢!我还有另一个问题。不知道有没有办法让shell脚本(或python脚本)等到MATLAB脚本完成? @CrisLuengo 还有一件事。自相矛盾的是,当手动运行脚本与从 Python 脚本运行脚本时,我得到了不同的结果。它们运行在相同的输入上,这很奇怪。 不同的结果?您运行的是相同版本的 MATLAB 吗?你运行的是完全相同的脚本吗?启动 MATLAB 时是否会执行相同的 startup.m 文件? 据我所知,我只有一个安装。是的,完全相同的脚本。如何检查正在使用的 startup.m?

以上是关于无法在 Windows/MSYS2 下从 bash 脚本运行 MATLAB的主要内容,如果未能解决你的问题,请参考以下文章

在没有 eval 的情况下从 bash 中的“key1='val1' key2='val2'”字符串中解析变量

windows (MSYS2) 上编译的 gtkmm 程序缺少库

无法在应用预览模式下从 cordova 应用程序连接到 Mobile First 适配器

如何在不回显的情况下从 shell 脚本中获取密码

无法在 Excel 崩溃的情况下从工作表中删除命令按钮

Linux下从终端打开指定目录 - open . - Win+Mac+Linux各自的方法