无法在 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 程序缺少库