Mathematica in modalità batch dalla riga di comando su Mac OS X
-
05-07-2019 - |
Domanda
Vorrei iniziare a scrivere alcuni unit test per i miei programmi Mathematica e controllare tutto dalla riga di comando con alcuni Makefile.
Sembra che Mathematica possa essere eseguito dalla riga di comando ma posso vedi le istruzioni di base per iniziare a farlo su Mac OS X & # 8212; qualcuno l'ha mai fatto prima?
Aggiornamento:
Creazione di un file di test come questo:
Print["hello"]; x := 1; y = x+1; z = y+1; Print["y="ToString@y]; Print["z="ToString@z]; Quit[];
E eseguendolo con
/Applications/Mathematica.app/Contents/MacOS/MathKernel -noprompt < test.m
è il più vicino possibile a una sorta di elaborazione batch. L'output sembra brutto, però; vengono aggiunte nuove righe per ogni riga dello script!
"hello" "y=2" "z=3"
È questa la cosa più vicina a uno script che può ancora generare informazioni sull'output della console? Sto solo usando Mathematica 6, ma spero che non faccia alcuna differenza.
Soluzione
Questo, infine, fornisce un output come mi aspetterei:
/Applications/Mathematica.app/Contents/MacOS/MathKernel -noprompt -run "<<test.m"
Suppongo che abbia senso. Aggiungendo questo al mio .bash_profile
è possibile eseguire facilmente (come in mma test.m
):
mma () { /Applications/Mathematica.app/Contents/MacOS/MathKernel -noprompt -run "<<$1" ; }
Vedi anche lo script Perl mash
di dreeves, che può offrire vantaggi rispetto a questo approccio.
Altri suggerimenti
Con alcuni esperimenti, ho scoperto che /Applications/Mathematica.app/Contents/MacOS/MathKernel
può essere lanciato dalla riga di comando. Tuttavia, non sembra accettare i soliti flag della riga di comando -h
o --help
.
Grazie a Pillsy e Will Robertson per la presa MASH! Ecco la domanda StackOverflow pertinente: Chiama un programma Mathematica dalla riga di comando, con args della riga di comando, stdin , stdout e stderr
Se non si utilizza MASH, è possibile utilizzare le seguenti funzioni di utilità definite da MASH. Ad esempio, la stampa standard stamperà le stringhe con virgolette, di solito non quello che vuoi negli script.
ARGV = args = Drop[$CommandLine, 4]; (* Command line args. *)
pr = WriteString["stdout", ##]&; (* More *)
prn = pr[##, "\n"]&; (* convenient *)
perr = WriteString["stderr", ##]&; (* print *)
perrn = perr[##, "\n"]&; (* statements. *)
EOF = EndOfFile; (* I wish mathematica *)
eval = ToExpression; (* weren't so damn *)
re = RegularExpression; (* verbose! *)
read[] := InputString[""]; (* Grab a line from stdin. *)
doList[f_, test_] := (* Accumulate list of what f[] *)
Most@NestWhileList[f[]&, f[], test]; (* returns while test is true. *)
readList[] := doList[read, #=!=EOF&]; (* Slurp list'o'lines from stdin *)
Per usare MASH, basta prendere quel file perl, mash.pl , quindi rendi il tuo test.m simile al seguente:
#!/usr/bin/env /path/to/mash.pl
prn["hello"];
x := 1;
y = x+1;
z = y+1;
prn["y=", y];
prn["z=", z];