Matlab: Запуск m-файлу з командного рядка


106

Припустимо, що;

Я маю m-файл за адресою:
C:\M1\M2\M3\mfile.m

І EXE-файл matlab знаходиться в цьому місці:
C:\E1\E2\E3\matlab.exe

Я хочу запустити цей m-файл із Matlab з командного рядка, наприклад, всередині .bat-файлу. Як я можу це зробити, чи є спосіб це зробити?


Відповіді:


106

Така команда успішно запускає 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/…
Eghbal

6
Це було б добре, якщо ви додасте команду "вихід" наприкінці, щоб зробити свою відповідь більш практичною та корисною.
Kamran Bigdely

3
Одиночні та подвійні лапки в і навколо команди "run" є важливими!
Kamran Bigdely

5
Що робити, якщо ви хочете передати аргументи?

Чи підтримує версія Windows опцію -nodesktop? Я думав, що ні, але можливо помиляюся.
Terje Sandstrøm

70

Я думаю, що одним із важливих моментів, про який не було сказано в попередніх відповідях, є те, що, якщо не буде чітко зазначено, перекладач з математики залишиться відкритим. Тому до відповіді @hkBattousai я додам exitкоманду:

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


7
Чомусь, якщо mfile.mвикликає помилку, явна exitфункція ніколи не викликається, змушує весь процес чекати ...
malat

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"

Я знайшов оригінальне посилання тут . Оскільки оригінального посилання зараз немає, ось посилання на альтернативний читач, який досі живе


26

У 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інакше.


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


8

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


4

Так 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

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'

(Це після пари спроб та помилок)

Використовуючи наш веб-сайт, ви визнаєте, що прочитали та зрозуміли наші Політику щодо файлів cookie та Політику конфіденційності.
Licensed under cc by-sa 3.0 with attribution required.