【问题标题】:Cannot run MATLAB from bash script under Windows/MSYS2无法在 Windows/MSYS2 下从 bash 脚本运行 MATLAB
【发布时间】: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 脚本中执行此操作,我们将不胜感激。

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

【问题讨论】:

    标签: python windows bash matlab msys


    【解决方案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?
    猜你喜欢
    • 1970-01-01
    • 2010-11-09
    • 2016-10-20
    • 1970-01-01
    • 2011-08-10
    • 2015-12-10
    • 2012-09-14
    • 2013-01-12
    • 2023-03-14
    相关资源
    最近更新 更多