【问题标题】:Matlab: Running an m-file from command-lineMatlab:从命令行运行 m 文件
【发布时间】:2011-10-03 04:12:13
【问题描述】:

假设;

我在以下位置有一个 m 文件:
C:\M1\M2\M3\mfile.m

matlab的exe文件在这个位置:
C:\E1\E2\E3\matlab.exe

我想用 Matlab 从命令行运行这个 m 文件,例如在 .bat 文件中。我该怎么做,有办法吗?

【问题讨论】:

标签: matlab command-line automation


【解决方案1】:

步骤如下:

  1. 启动命令行。
  2. cd C:\M1\M2\M3输入包含.m文件的文件夹
  3. 运行以下命令:C:\E1\E2\E3\matlab.exe -r mfile

Windows 系统将使用您的当前文件夹作为 MATLAB 搜索 .m 文件的位置,-r 选项会在启动时尝试启动给定的 .m 文件。

【讨论】:

  • 它不会在 .bat 文件中运行。我举了一个例子。其实我会通过Win32 API函数CreateProcessW()来运行。
【解决方案2】:

这样的命令成功运行m文件:

"C:\<a long path here>\matlab.exe" -nodisplay -nosplash -nodesktop -r "run('C:\<a long path here>\mfile.m'); exit;"

【讨论】:

  • 另一个类似的问题在这里回复:stackoverflow.com/questions/25102699/…
  • 如果你在最后添加“exit”命令会更好,让你的答案更实用和有用。
  • “run”命令前后的单引号和双引号很重要!
  • 如果你想传递参数怎么办?
  • Windows 版本是否支持 -nodesktop 选项?我认为不是,但可能是错的。
【解决方案3】:

我认为前面的答案中没有提到的一个重要点是,如果没有明确指出,matlab 解释器将保持打开状态。 因此,对于@hkBattousai 的回答,我将添加exit 命令:

"C:\<a long path here>\matlab.exe" -nodisplay -nosplash -nodesktop -r "run('C:\<a long path here>\mfile.m');exit;"

【讨论】:

  • 由于某种原因,如果mfile.m 触发错误,则永远不会调用显式exit 函数,从而使整个过程等待...
【解决方案4】:

这是我将改用的,以优雅地处理脚本中的错误:

"C:\<a long path here>\matlab.exe" -nodisplay -nosplash -nodesktop -r "try, run('C:\<a long path here>\mfile.m'), catch, exit, end, exit"

如果你想要更详细:

"C:\<a long path here>\matlab.exe" -nodisplay -nosplash -nodesktop -r "try, run('C:\<a long path here>\mfile.m'), catch me, fprintf('%s / %s\n',me.identifier,me.message), end, exit"

我找到了原始参考here。由于原来的链接现在已经消失,这里是一个今天仍然活着的替代新读者的链接:

【讨论】:

    【解决方案5】:

    在 Linux 上,您也可以这样做,并且实际上可以将自定义错误代码发送回 shell,如下所示:

    #!/bin/bash
    matlab -nodisplay -nojvm -nosplash -nodesktop -r \ 
          "try, run('/foo/bar/my_script.m'), catch, exit(1), end, exit(0);"
    echo "matlab exit code: $?"
    

    如果脚本抛出异常则打印matlab exit code: 1,否则打印matlab exit code: 0

    【讨论】:

    • 要像 MATLAB 在未捕获错误时那样显示错误,只需执行 "try, run('/foo/bar/my_script.m'), catch e, disp(getReport(e)), exit(1), end, exit(0);"
    【解决方案6】:

    感谢马拉特。你的comment 帮助了我。 但我想添加我的 try-catch 块,因为我找到了 MExeption 方法 getReport() ,它返回整个错误消息并将其打印到 matlab 控制台。

    另外我打印了文件名,因为这个编译是调用 matlab 的批处理脚本的一部分。

    try
        some_code
        ...
    catch message
        display(['ERROR in file: ' message.stack.file])
        display(['ERROR: ' getReport(message)])
    end;
    

    对于传递给旧代码生成方法的错误模型名称,输出如下所示:

    ERROR in file: C:\..\..\..
    ERROR: Undefined function or variable 'modelname'.
    
    Error in sub-m-file (line 63)
    legacy_code( 'slblock_generate', specs, modelname);
    
    Error in m-file (line 11)
    sub-m-file
    
    Error in run (line 63)
    evalin('caller', [script ';']);
    

    最后,要在 windows 命令提示符窗口显示输出,只需将 matlab 控制台记录到带有-logfile logfile.txt 的文件(另外使用-wait)并调用批处理命令type logfile.txt

    【讨论】:

      【解决方案7】:
      cat 1.m | matlab -nodesktop -nosplash
      

      我用的是 Ubuntu

      【讨论】:

        【解决方案8】:

        由于没有一个答案包含有关输入参数的信息,因此重要的是 在此处添加。经过一番研究,我发现了这个link

        输入参数与我们运行 Matlab 函数的方式非常相似。

        matlab -r 'try myfunction(argument1,argument2); catch; end; quit'
        

        如果您以某种方式从 bash/终端获取参数,您只需将其插入到 bash 命令中:

        matlab -r 'try myfunction($MY_BASH_ARG,argument2); catch; end; quit'
        

        (这是经过几次反复试验)

        【讨论】:

        • 您可以使用matlab -r "addpath('/my/mfile/directory/'); my_mfilename(argument1, argument2)",这样您就不必依赖可以通过startup.m重置的工作目录
        【解决方案9】:

        从 R2019b 开始,有一个新的命令行选项,-batch。它取代了不再推荐的-r。它还统一了跨平台的语法。参见例如the documentation for Windows,对于其他平台的描述是相同的。

        matlab -batch "statement to run"
        

        这会在没有桌面或初始屏幕的情况下启动 MATLAB,将所有输出记录到 stdoutstderr,在语句完成时自动退出,并提供一个退出代码来报告成功或错误。

        因此不再需要在运行代码周围使用try/catch,也不再需要添加exit 语句。

        【讨论】:

          【解决方案10】:

          我在 bash 脚本中运行此命令,特别是提交 SGE 作业和批处理内容:

          /Path_to_matlab -nodisplay -nosplash -nodesktop < m_file.m
          

          【讨论】:

            猜你喜欢
            • 1970-01-01
            • 2013-11-14
            • 1970-01-01
            • 2014-01-21
            • 1970-01-01
            • 1970-01-01
            • 1970-01-01
            • 2012-03-05
            • 1970-01-01
            相关资源
            最近更新 更多