Matlab: ejecutar un archivo m desde la línea de comandos

106

Suponer que;

Tengo un archivo m en la ubicación:
C:\M1\M2\M3\mfile.m

Y el archivo exe de matlab está en esta ubicación:
C:\E1\E2\E3\matlab.exe

Quiero ejecutar este archivo m con Matlab, desde la línea de comandos, por ejemplo, dentro de un archivo .bat. ¿Cómo puedo hacer esto? ¿Hay alguna manera de hacerlo?

hkBattousai
fuente

Respuestas:

106

Un comando como este ejecuta el archivo-m con éxito:

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

hkBattousai
fuente
Otra pregunta similar está aquí para responder: stackoverflow.com/questions/25102699/…
Eghbal
6
Eso sería bueno si agrega el comando "salir" al final para que su respuesta sea más práctica y útil.
Kamran Bigdely
3
Las comillas simples y dobles dentro y alrededor del comando "ejecutar" son importantes.
Kamran Bigdely
5
¿Qué pasa si quieres pasar argumentos?
¿La versión de Windows admite la opción -nodesktop? Pensé que no, pero puedo estar equivocado.
Terje Sandstrøm
70

Creo que un punto importante que no se mencionó en las respuestas anteriores es que, si no se indica explícitamente, el intérprete de matlab permanecerá abierto. Por lo tanto, a la respuesta de @hkBattousai agregaré el exitcomando:

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

Elachell
fuente
7
Por alguna razón, si se mfile.mactiva un error, la exitfunción explícita nunca se llama, lo que hace que todo el proceso espere ...
malat
41

Esto es lo que usaría en su lugar, para manejar con gracia los errores del 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"

Si quieres más verbosidad:

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

Encontré la referencia original aquí . Dado que el enlace original ya no existe, aquí está el enlace a un nuevo lector alternativo que sigue vivo hoy:

malat
fuente
26

En Linux puede hacer lo mismo y puede enviar de vuelta al shell un código de error personalizado, como el siguiente:

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

se imprime matlab exit code: 1si el script arroja una excepción, de lo matlab exit code: 0contrario.

slux83
fuente
3
Para mostrar el error como lo haría MATLAB cuando no lo "try, run('/foo/bar/my_script.m'), catch e, disp(getReport(e)), exit(1), end, exit(0);"
detecta
13

Estos son los pasos:

  1. Inicie la línea de comando.
  2. Introduzca la carpeta que contiene el archivo .m con cd C:\M1\M2\M3
  3. Ejecute lo siguiente: C:\E1\E2\E3\matlab.exe -r mfile

Los sistemas Windows utilizarán su carpeta actual como ubicación para que MATLAB busque archivos .m, y la -ropción intenta iniciar el archivo .m dado tan pronto como se inicie.

oso hormiguero
fuente
1
No se ejecutará dentro de un archivo .bat. Lo di como ejemplo. En realidad, lo ejecutaré mediante la función API de Win32 CreateProcessW().
hkBattousai
12
cat 1.m | matlab -nodesktop -nosplash

Y yo uso Ubuntu

Jia Ruipeng
fuente
8

Gracias a malat. Tu comentario me ayudó. Pero quiero agregar mi bloque try-catch, ya que encontré el MExeptionmétodo getReport()que devuelve el mensaje de error completo y lo imprime en la consola de matlab.

Además imprimí el nombre del archivo ya que esta compilación es parte de un script por lotes que llama a matlab.

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

Para un nombre de modelo falso pasado al método de generación de código heredado, la salida se vería así:

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

Finalmente, para mostrar la salida en la ventana del símbolo del sistema de Windows, simplemente registre la consola de matlab en un archivo con -logfile logfile.txt(use adicionalmente -wait) y llame al comando por lotestype logfile.txt

CanO
fuente
4

Desde R2019b, hay una nueva opción de línea de comandos, -batch. Reemplaza -r, que ya no se recomienda. También unifica la sintaxis entre plataformas. Vea por ejemplo la documentación para Windows , para las otras plataformas la descripción es idéntica.

matlab -batch "statement to run"

Esto inicia MATLAB sin el escritorio o la pantalla de presentación, registra todos los resultados en stdouty stderr, sale automáticamente cuando se completa la declaración y proporciona un código de salida que informa el éxito o el error.

Por lo tanto, ya no es necesario usar try/ catchalrededor del código para ejecutar, y ya no es necesario agregar una exitdeclaración.

Cris Luengo
fuente
2

Ejecuto este comando dentro de un script bash, en particular para enviar trabajos SGE y procesar cosas por lotes:

/Path_to_matlab -nodisplay -nosplash -nodesktop < m_file.m
LMLacerda
fuente
0

Dado que ninguna de las respuestas tiene información sobre la alimentación del argumento de entrada, es importante agregarlo aquí. Después de investigar un poco, encontré este enlace.

Alimentar los argumentos es muy similar a cómo ejecutamos una función de Matlab.

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

Si de alguna manera está obteniendo un argumento de bash / terminal, simplemente necesita insertarlo en el comando bash como:

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

(Esto es después de un par de prueba y error)

smttsp
fuente