Ответ 1
Команда вроде этого успешно запускает файл m:
"C:\<a long path here>\matlab.exe" -nodisplay -nosplash -nodesktop -r "run('C:\<a long path here>\mfile.m');"
Предположим, что:
У меня есть m файл в местоположении: C:\M1\M2\M3\mfile.m
И файл exe из matlab находится в этом месте: C:\E1\E2\E3\matlab.exe
Я хочу запустить этот m файл с помощью Matlab из командной строки, например, внутри файла .bat. Как я могу это сделать, есть ли способ сделать это?
Команда вроде этого успешно запускает файл m:
"C:\<a long path here>\matlab.exe" -nodisplay -nosplash -nodesktop -r "run('C:\<a long path here>\mfile.m');"
Я думаю, что один важный момент, который не упоминался в предыдущих ответах, заключается в том, что если явно не указано, интерпретатор matlab останется открытым.
Поэтому, чтобы ответить на @hkBattousai, я добавлю команду exit
:
"C:\<a long path here>\matlab.exe" -nodisplay -nosplash -nodesktop -r "run('C:\<a long path here>\mfile.m');exit;"
Вот что я хотел бы использовать вместо этого, чтобы изящно обрабатывать ошибки из script:
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"
Я нашел исходную ссылку здесь.
В 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
, если script выдает исключение, matlab exit code: 0
в противном случае.
Вот шаги:
cd C:\M1\M2\M3
C:\E1\E2\E3\matlab.exe -r mfile
Системы Windows будут использовать вашу текущую папку в качестве местоположения MATLAB для поиска файлов .m, а параметр -r
пытается запустить данный .m файл, как только произойдет запуск.
cat 1.m | matlab -nodesktop -nosplash
И я использую Ubuntu
Благодаря малату. Ваш комментарий помог мне.
Но я хочу добавить блок try-catch, так как нашел метод MExeption
getReport()
, который возвращает все сообщение об ошибке и печатает его в консоли matlab.
Кроме того, я напечатал имя файла, поскольку эта компиляция является частью пакета script, который вызывает 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
Начиная с R2019b, появилась новая опция командной строки, -batch
. Он заменяет -r
, который больше не рекомендуется. Он также унифицирует синтаксис на разных платформах. См., Например, документацию для Windows, для других платформ описание идентично.
matlab -batch "statement to run"
Это запускает MATLAB без рабочего стола или заставки, регистрирует все выходные данные в stdout
и stderr
, автоматически завершает работу после завершения оператора и предоставляет код завершения, сообщающий об успехе или ошибке.
Таким образом, больше нет необходимости использовать try
/catch
вокруг кода для запуска, и больше нет необходимости добавлять оператор exit
.
Я запускаю эту команду в скрипте bash, в частности, для отправки заданий SGE и процессов пакетной обработки:
/Path_to_matlab -nodisplay -nosplash -nodesktop < m_file.m
Поскольку ни один из ответов не содержит информацию о вводе входного аргумента, важно добавь это сюда. После некоторых исследований я нашел эту ссылку
Подача аргументов очень похожа на то, как мы запускаем функцию Matlab.
matlab -r 'try myfunction(argument1,argument2); catch; end; quit'
Если вы как-то получаете аргумент из bash/терминал, вам просто нужно вставить его в команду bash следующим образом:
matlab -r 'try myfunction($MY_BASH_ARG,argument2); catch; end; quit'
(это после пары проб и ошибок)