Matlab: esecuzione di un file m dalla riga di comando


106

Supporre che;

Ho un file m nella posizione:
C:\M1\M2\M3\mfile.m

E il file exe del matlab si trova in questa posizione:
C:\E1\E2\E3\matlab.exe

Voglio eseguire questo m-file con Matlab, dalla riga di comando, ad esempio all'interno di un file .bat. Come posso farlo, c'è un modo per farlo?


Risposte:


106

Un comando come questo esegue correttamente il file m:

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


Un'altra domanda simile è qui per rispondere: stackoverflow.com/questions/25102699/…
— Eghbal

6
Sarebbe utile se aggiungi il comando "exit" alla fine per rendere la tua risposta più pratica e utile.
— Kamran Bigdely

3
Le virgolette singole e doppie dentro e intorno al comando "run" sono importanti!
— Kamran Bigdely

5
E se volessi passare argomenti?

La versione di Windows supporta l'opzione -nodesktop? Ho pensato di no, ma potrebbe essere sbagliato.
— Terje Sandstrøm

70

Penso che un punto importante che non è stato menzionato nelle risposte precedenti è che, se non esplicitamente indicato, l'interprete matlab rimarrà aperto. Pertanto, alla risposta di @hkBattousai aggiungerò il exitcomando:

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


7
Per qualche motivo se si mfile.mattiva un errore la exitfunzione esplicita non viene mai chiamata, facendo attendere l'intero processo ...
— malat

41

Ecco cosa userei invece, per gestire con garbo gli errori dallo 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"

Se vuoi più verbosità:

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

Ho trovato il riferimento originale qui . Poiché il collegamento originale è ora scomparso, ecco il collegamento a un nuovo lettore alternativo ancora attivo oggi:


26

Su Linux puoi fare lo stesso e puoi effettivamente rimandare alla shell un codice di errore personalizzato, come il seguente:

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

stampa matlab exit code: 1se lo script genera un'eccezione, matlab exit code: 0altrimenti.


3
Per visualizzare l'errore come farebbe MATLAB quando non lo "try, run('/foo/bar/my_script.m'), catch e, disp(getReport(e)), exit(1), end, exit(0);"
— rileva

13

Ecco i passaggi:

  1. Avvia la riga di comando.
  2. Entra nella cartella contenente il file .m con cd C:\M1\M2\M3
  3. Eseguire quanto segue: C:\E1\E2\E3\matlab.exe -r mfile

I sistemi Windows useranno la cartella corrente come posizione in cui MATLAB cerca i file .m e l' -ropzione tenta di avviare il file .m specificato non appena si verifica l'avvio.


1
Non verrà eseguito all'interno di un file .bat. L'ho dato come esempio. In realtà, lo eseguirò dalla funzione API Win32 CreateProcessW().
— hkBattousai


8

Grazie a Malat. Il tuo commento mi ha aiutato. Ma voglio aggiungere il mio blocco try-catch, poiché ho trovato il MExeptionmetodo getReport()che restituisce l'intero messaggio di errore e lo stampa sulla console Matlab.

Inoltre ho stampato il nome del file poiché questa compilation fa parte di uno script batch che chiama matlab.

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

Per un nome di modello falso passato al metodo di generazione del codice legacy, l'output sarebbe simile a:

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

Infine, per visualizzare l'output nella finestra del prompt dei comandi di Windows, è sufficiente registrare la console Matlab in un file con -logfile logfile.txt(utilizzare in aggiunta -wait) e chiamare il comando batchtype logfile.txt


4

Dal R2019b, c'è una nuova opzione riga di comando, -batch. Sostituisce -r, che non è più consigliato. Unifica anche la sintassi tra le piattaforme. Vedi ad esempio la documentazione per Windows , per le altre piattaforme la descrizione è identica.

matlab -batch "statement to run"

Ciò avvia MATLAB senza il desktop o la schermata iniziale, registra tutto l'output su stdoute stderr, esce automaticamente al termine dell'istruzione e fornisce un codice di uscita che segnala il successo o l'errore.

Non è quindi più necessario utilizzare try/ catchintorno al codice da eseguire e non è più necessario aggiungere exitun'istruzione.


2

Eseguo questo comando all'interno di uno script bash, in particolare per inviare lavori SGE e cose di processo batch:

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

0

Poiché nessuna delle risposte contiene informazioni sull'alimentazione dell'argomento di input, è importante aggiungerla qui. Dopo alcune ricerche, ho trovato questo collegamento

Il feed degli argomenti è molto simile a come eseguiamo una funzione Matlab.

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

Se in qualche modo stai ricevendo un argomento da bash / terminal, devi semplicemente inserirlo nel comando bash come:

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

(Questo è dopo un paio di tentativi ed errori)

Utilizzando il nostro sito, riconosci di aver letto e compreso le nostre Informativa sui cookie e Informativa sulla privacy.
Licensed under cc by-sa 3.0 with attribution required.