Mathematica na modalidade de grupo a partir da linha de comando no Mac OS X
-
05-07-2019 - |
Pergunta
Eu gostaria de começar a escrever alguns testes de unidade para meus programas Mathematica e controlar tudo a partir da linha de comando com algumas Makefiles.
Parece que Mathematica pode ser executado a partir da linha de comando mas eu posso 't ver qualquer instruções básicas sobre como começar com fazer isso no Mac OS X - alguém já fez isso antes
?Update:
Criando um arquivo de teste como este:
Print["hello"]; x := 1; y = x+1; z = y+1; Print["y="ToString@y]; Print["z="ToString@z]; Quit[];
E executá-lo com
/Applications/Mathematica.app/Contents/MacOS/MathKernel -noprompt < test.m
é o mais próximo que posso chegar a algum tipo de processamento em lote. A saída é feio, embora; novas linhas são adicionadas para cada linha do script!
"hello" "y=2" "z=3"
Esta é a coisa mais próxima que pode chegar a um script que pode informação ainda saída para a saída do console? Eu só estou usando Mathematica 6, mas espero que não fazer a diferença.
Solução
Este, finalmente, dá uma saída como eu esperaria que:
/Applications/Mathematica.app/Contents/MacOS/MathKernel -noprompt -run "<<test.m"
Faz sentido, eu suponho. Adicionando este à minha .bash_profile
permite fácil execução (como no mma test.m
):
mma () { /Applications/Mathematica.app/Contents/MacOS/MathKernel -noprompt -run "<<$1" ; }
Veja também mash
das dreeves script Perl, que pode oferecer vantagens sobre esta abordagem.
Outras dicas
Com algumas experiências, descobri que /Applications/Mathematica.app/Contents/MacOS/MathKernel
pode ser iniciado a partir da linha de comando. Não parece aceitar as habituais -h
ou de linha de comando --help
bandeiras, apesar de tudo.
Graças à Pillsy e Will Robertson para o plug MASH! Aqui está a pergunta StackOverflow relevante: chamar um programa Mathematica na linha de comando, com os argumentos de linha de comando, stdin , stdout, e stderr
Se você não usar MASH, você pode querer usar as seguintes funções utilitárias que define MASH. Por exemplo, o padrão Imprimir imprimirá cordas com aspas - geralmente não o que você quer em scripts
.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 *)
Para usar MASH, basta pegar esse arquivo perl, mash.pl , e, em seguida, fazer o seu test.m como o seguinte:
#!/usr/bin/env /path/to/mash.pl
prn["hello"];
x := 1;
y = x+1;
z = y+1;
prn["y=", y];
prn["z=", z];