Matlab: exécution d'un fichier m à partir de la ligne de commande

107

Supposer que;

J'ai un fichier m à l'emplacement:
C:\M1\M2\M3\mfile.m

Et le fichier exe du matlab se trouve à cet emplacement:
C:\E1\E2\E3\matlab.exe

Je veux exécuter ce m-file avec Matlab, à partir de la ligne de commande, par exemple dans un fichier .bat. Comment puis-je faire cela, y a-t-il un moyen de le faire?

hkBattousai
la source

Réponses:

107

Une commande comme celle-ci exécute le fichier m avec succès:

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

hkBattousai
la source
Une autre question similaire est ici pour répondre: stackoverflow.com/questions/25102699/…
Eghbal
6
Ce serait bien si vous ajoutez la commande "exit" à la fin pour rendre votre réponse plus pratique et utile.
Kamran Bigdely
3
Les guillemets simples et doubles dans et autour de la commande "exécuter" sont importants!
Kamran Bigdely
5
Et si vous voulez passer des arguments?
La version Windows prend-elle en charge l'option -nodesktop? Je n'ai pas pensé, mais j'ai peut-être tort.
Terje Sandstrøm
70

Je pense qu'un point important qui n'a pas été mentionné dans les réponses précédentes est que, s'il n'est pas explicitement indiqué, l'interpréteur matlab restera ouvert. Par conséquent, à la réponse de @hkBattousai, j'ajouterai la exitcommande:

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

Elachell
la source
7
Pour une raison quelconque, si mfile.mdéclenche une erreur, la exitfonction explicite n'est jamais appelée, ce qui fait attendre tout le processus ...
malat
41

Voici ce que j'utiliserais à la place, pour gérer gracieusement les erreurs du 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 vous voulez plus de 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"

J'ai trouvé la référence originale ici . Puisque le lien d'origine a maintenant disparu, voici le lien vers un nouveau lecteur alternatif toujours en vie aujourd'hui:

malat
la source
27

Sous Linux, vous pouvez faire de même et vous pouvez en fait renvoyer au shell un code d'erreur personnalisé, comme suit:

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

il imprime matlab exit code: 1si le script lève une exception, matlab exit code: 0sinon.

slux83
la source
3
Pour afficher l'erreur comme le ferait MATLAB lorsqu'il ne l'attrape pas, il suffit de le faire "try, run('/foo/bar/my_script.m'), catch e, disp(getReport(e)), exit(1), end, exit(0);"
danieleds
13

Voici les étapes:

  1. Démarrez la ligne de commande.
  2. Entrez le dossier contenant le fichier .m avec cd C:\M1\M2\M3
  3. Exécutez ce qui suit: C:\E1\E2\E3\matlab.exe -r mfile

Les systèmes Windows utiliseront votre dossier actuel comme emplacement pour MATLAB pour rechercher les fichiers .m, et l' -roption essaiera de démarrer le fichier .m donné dès le démarrage.

Aardvarkk
la source
1
Il ne fonctionnera pas dans un fichier .bat. Je l'ai donné à titre d'exemple. En fait, je vais l'exécuter par la fonction API Win32 CreateProcessW().
hkBattousai
12
cat 1.m | matlab -nodesktop -nosplash

Et j'utilise Ubuntu

Jia Ruipeng
la source
8

Merci à malat. Votre commentaire m'a aidé. Mais je veux ajouter mon bloc try-catch, car j'ai trouvé la MExeptionméthode getReport()qui renvoie le message d'erreur complet et l'affiche sur la console matlab.

De plus, j'ai imprimé le nom du fichier car cette compilation fait partie d'un script batch qui appelle matlab.

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

Pour un faux nom de modèle passé à la méthode de génération de code héritée, la sortie ressemblerait à:

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

Enfin, pour afficher la sortie dans la fenêtre d'invite de commande Windows, enregistrez simplement la console matlab dans un fichier avec -logfile logfile.txt(utilisez en plus -wait) et appelez la commande batchtype logfile.txt

CanO
la source
5

Depuis R2019b, il y a une nouvelle option de ligne de commande, -batch. Il remplace -r, ce qui n'est plus recommandé. Il unifie également la syntaxe entre les plates-formes. Voir par exemple la documentation de Windows , pour les autres plates-formes la description est identique.

matlab -batch "statement to run"

Cela démarre MATLAB sans le bureau ou l'écran de démarrage, enregistre toutes les sorties dans stdoutet stderr, se ferme automatiquement lorsque l'instruction se termine et fournit un code de sortie signalant une réussite ou une erreur.

Il n'est donc plus nécessaire d'utiliser try/ catchautour du code à exécuter, et il n'est plus nécessaire d'ajouter une exitinstruction.

Cris Luengo
la source
2

J'exécute cette commande dans un script bash, en particulier pour soumettre des travaux SGE et des processus de traitement par lots:

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

Comme aucune des réponses ne contient d'informations sur l'alimentation de l'argument d'entrée, il est important de l'ajouter ici. Après quelques recherches, j'ai trouvé ce lien

L'alimentation des arguments est très similaire à la façon dont nous exécutons une fonction Matlab.

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

Si vous obtenez en quelque sorte un argument de bash / terminal, vous devez simplement l'insérer dans la commande bash comme suit:

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

(C'est après quelques essais et erreurs)

smttsp
la source