Matlab: Uruchamianie pliku m z wiersza poleceń

107

Przypuszczam, że;

Mam plik m w lokalizacji:
C:\M1\M2\M3\mfile.m

A plik exe programu Matlab znajduje się w tej lokalizacji:
C:\E1\E2\E3\matlab.exe

Chcę uruchomić ten plik m za pomocą Matlab, z wiersza poleceń, na przykład w pliku .bat. Jak mogę to zrobić, czy jest na to sposób?

hkBattousai
źródło

Odpowiedzi:

107

Polecenie takie jak to pomyślnie uruchamia plik m:

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

hkBattousai
źródło
Kolejne podobne pytanie jest tutaj, aby odpowiedzieć: stackoverflow.com/questions/25102699/…
Eghbal
6
Byłoby dobrze, gdyby na końcu dodano polecenie „exit”, aby Twoja odpowiedź była bardziej praktyczna i pomocna.
Kamran Bigdely
3
Pojedyncze i podwójne cudzysłowy w i wokół polecenia „uruchom” są ważne!
Kamran Bigdely
5
A co jeśli chcesz przekazać argumenty?
Czy wersja systemu Windows obsługuje opcję -nodesktop? Myślałem, że nie, ale może się mylić.
Terje Sandstrøm
70

Myślę, że jedną ważną kwestią, o której nie wspomniano w poprzednich odpowiedziach, jest to, że jeśli nie zostanie to wyraźnie wskazane, tłumacz języka Matlab pozostanie otwarty. Dlatego do odpowiedzi @hkBattousai dodam exitpolecenie:

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

elachell
źródło
7
Z jakiegoś powodu, jeśli mfile.mwywoła błąd, jawna exitfunkcja nigdy nie jest wywoływana, co powoduje, że cały proces czeka ...
malat
41

Oto czego użyłbym zamiast tego, aby z wdziękiem obsługiwać błędy ze skryptu:

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

Jeśli chcesz więcej szczegółowości:

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

Znalazłem tutaj oryginalne odniesienie . Ponieważ oryginalne łącze zniknęło, oto łącze do alternatywnego, wciąż żywego czytnika:

malat
źródło
27

W systemie Linux możesz zrobić to samo i faktycznie możesz wysłać z powrotem do powłoki niestandardowy kod błędu, taki jak następujący:

#!/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: $?"

drukuje, matlab exit code: 1jeśli skrypt zgłosi wyjątek, w matlab exit code: 0przeciwnym razie.

slux83
źródło
3
Aby wyświetlić błąd tak, jak zrobiłby to MATLAB, gdy go nie wychwycił, po prostu zrób "try, run('/foo/bar/my_script.m'), catch e, disp(getReport(e)), exit(1), end, exit(0);"
danieleds
13

Oto kroki:

  1. Uruchom wiersz poleceń.
  2. Wprowadź folder zawierający plik .m z cd C:\M1\M2\M3
  3. Uruchom następujące: C:\E1\E2\E3\matlab.exe -r mfile

Systemy Windows użyją twojego aktualnego folderu jako lokalizacji dla MATLAB do wyszukiwania plików .m, a -ropcja spróbuje uruchomić dany plik .m zaraz po uruchomieniu.

aardvarkk
źródło
1
Nie będzie działać w pliku .bat. Podałem to jako przykład. Właściwie uruchomię go za pomocą funkcji Win32 API CreateProcessW().
hkBattousai
12
cat 1.m | matlab -nodesktop -nosplash

Używam Ubuntu

Jia Ruipeng
źródło
8

Dzięki malatowi. Twój komentarz mi pomógł. Ale chcę dodać mój blok try-catch, ponieważ znalazłem MExeptionmetodę, getReport()która zwraca cały komunikat o błędzie i wyświetla go na konsoli Matlab.

Dodatkowo wydrukowałem nazwę pliku, ponieważ ta kompilacja jest częścią skryptu wsadowego, który wywołuje matlab.

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

W przypadku fałszywej nazwy modelu przekazanej do starszej metody generowania kodu dane wyjściowe wyglądałyby następująco:

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 ';']);

Na koniec, aby wyświetlić dane wyjściowe w oknie wiersza polecenia systemu Windows, po prostu zaloguj się konsoli Matlab do pliku z -logfile logfile.txt(użyj dodatkowo -wait) i wywołaj polecenie wsadowetype logfile.txt

CanO
źródło
5

Od R2019b, pojawiła się nowa opcja wiersza poleceń -batch. Zastępuje to -r, co nie jest już zalecane. Ujednolica również składnię na różnych platformach. Zobacz na przykład dokumentację dla systemu Windows , w przypadku innych platform opis jest identyczny.

matlab -batch "statement to run"

To uruchamia MATLAB bez pulpitu lub ekranu powitalnego, rejestruje wszystkie dane wyjściowe do stdouti stderr, kończy się automatycznie po zakończeniu instrukcji i wyświetla kod zakończenia raportujący powodzenie lub błąd.

W związku z tym nie jest już konieczne używanie try/ catchwokół kodu do uruchomienia i nie jest już konieczne dodawanie exitinstrukcji.

Cris Luengo
źródło
2

Uruchamiam to polecenie w skrypcie bash, w szczególności w celu przesłania zadań SGE i procesów wsadowych:

/Path_to_matlab -nodisplay -nosplash -nodesktop < m_file.m
LMLacerda
źródło
0

Ponieważ żadna z odpowiedzi nie zawiera informacji o podawaniu argumentów wejściowych, ważne jest, aby je tutaj dodać. Po kilku badaniach znalazłem ten link

Podawanie argumentów jest bardzo podobne do tego, jak uruchamiamy funkcję Matlab.

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

Jeśli w jakiś sposób otrzymujesz argument z bash / terminal, po prostu musisz wstawić go do polecenia bash jako:

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

(To jest po kilku próbach i błędach)

smttsp
źródło