Matlab: запуск m-файла из командной строки

107

Предположим, что;

У меня есть m-файл по адресу:
C:\M1\M2\M3\mfile.m

И exe-файл Matlab находится в этом месте:
C:\E1\E2\E3\matlab.exe

Я хочу запустить этот m-файл с помощью Matlab из командной строки, например, внутри файла .bat. Как я могу это сделать, есть ли способ это сделать?

hkBattousai
источник
1
вы можете найти их полезными: stackoverflow.com/questions/14495/… , stackoverflow.com/questions/1857825/run-matlab-in-batch-mode
Amro

Ответы:

107

Подобная команда успешно запускает m-файл:

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

hkBattousai
источник
Другой аналогичный вопрос здесь, чтобы ответить: stackoverflow.com/questions/25102699/…
Eghbal 03
6
Было бы хорошо, если бы вы добавили команду «exit» в конце, чтобы ваш ответ был более практичным и полезным.
Kamran Bigdely
3
Одиночные и двойные кавычки внутри и вокруг команды "run" важны!
Kamran Bigdely
5
Что, если вы хотите передать аргументы?
Поддерживает ли версия для Windows параметр -nodesktop? Я думал, что нет, но может ошибаться.
Terje Sandstrøm
70

Я думаю, что один важный момент, который не был упомянут в предыдущих ответах, заключается в том, что, если это явно не указано, интерпретатор Matlab останется открытым. Поэтому к ответу @hkBattousai добавлю exitкоманду:

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

Elachell
источник
7
По какой-то причине, если mfile.mвызывает ошибку, явная exitфункция никогда не вызывается, заставляя весь процесс ждать ...
малат
41

Вот что я бы использовал вместо этого, чтобы изящно обрабатывать ошибки из скрипта:

"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"

Я нашел оригинальную ссылку здесь . Поскольку исходной ссылки больше нет, вот ссылка на альтернативную программу чтения, которая все еще существует:

малат
источник
27

В Linux вы можете сделать то же самое, и вы действительно можете отправить обратно в оболочку собственный код ошибки, например следующий:

#!/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противном случае.

slux83
источник
3
Чтобы отобразить ошибку, как это делал бы MATLAB, когда ее не улавливали, просто сделайте это "try, run('/foo/bar/my_script.m'), catch e, disp(getReport(e)), exit(1), end, exit(0);"
danieleds
13

Вот шаги:

  1. Запустите командную строку.
  2. Войдите в папку, содержащую файл .m с cd C:\M1\M2\M3
  3. Выполните следующее: C:\E1\E2\E3\matlab.exe -r mfile

Системы Windows будут использовать вашу текущую папку в качестве местоположения для MATLAB для поиска файлов .m, и -rопция пытается запустить данный файл .m, как только происходит запуск.

муравьед
источник
1
Он не работает внутри файла .bat. Я привел это в качестве примера. Собственно, я буду запускать его функцией Win32 API CreateProcessW().
hkBattousai
12
cat 1.m | matlab -nodesktop -nosplash

И я использую Ubuntu

Цзя Руйпэн
источник
8

Благодаря малату. Ваш комментарий мне помог. Но я хочу добавить свой блок 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

CanO
источник
5

Начиная с R2019b, появился новый параметр командной строки -batch. Он заменяет -r, что больше не рекомендуется. Он также унифицирует синтаксис для разных платформ. См., Например, документацию для Windows , для других платформ описание идентично.

matlab -batch "statement to run"

Это запускает MATLAB без рабочего стола или экрана-заставки, регистрирует весь вывод в stdoutи stderr, выходит автоматически, когда оператор завершается, и предоставляет код выхода, сообщающий об успехе или ошибке.

Таким образом, больше нет необходимости использовать try/ catchвокруг кода для запуска, и больше нет необходимости добавлять exitоператор.

Крис Луенго
источник
2

Я запускаю эту команду в сценарии bash, в частности, для отправки заданий SGE и пакетной обработки:

/Path_to_matlab -nodisplay -nosplash -nodesktop < m_file.m
LMLacerda
источник
0

Поскольку ни в одном из ответов нет информации о входном аргументе подачи, важно добавить его здесь. После некоторого исследования я нашел эту ссылку

Подача аргументов очень похожа на то, как мы запускаем функцию Matlab.

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

Если вы каким-то образом получаете аргумент от bash / terminal, вам просто нужно вставить его в команду bash как:

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

(Это после пары проб и ошибок)

smttsp
источник