Chamar um programa Mathematica na linha de comando, com os argumentos de linha de comando, stdin, stdout e stderr

StackOverflow https://stackoverflow.com/questions/148057

Pergunta

Se você tem o código Mathematica em foo.m, Mathematica pode ser invocado com -noprompt e com -initfile foo.m (Ou -run "<<foo.m") e os argumentos de linha de comando estão disponíveis no $CommandLine (com lixo extra lá), mas há uma maneira de ter apenas algum código mathematica como

#!/usr/bin/env MathKernel
x = 2+2;
Print[x];
Print["There were ", Length[ARGV], " args passed in on the command line."];
linesFromStdin = readList[];
etc.

e chmod-lo executável e executá-lo? Em outras palavras, como é que uma utilização Mathematica como qualquer outra linguagem de script (Perl, Python, Ruby, etc)?

Foi útil?

Solução

MASH - Mathematica Scripting Corte -. Vai fazer isso

Desde Mathematica versão 6, os sufixos seguinte script de perl:

http://ai.eecs.umich.edu/people /dreeves/mash/mash.pl

Para versões anteriores do Mathematica, é necessário um programa C:

http://ai.eecs.umich.edu/people/dreeves / purê / PRE6

Atualização: finalmente, Mathematica 8 suporta esta nativamente com a opção de linha de comando "-script":

http://www.wolfram.com/ mathematica / new-in-8 / mathematica-shell-scripts /

Outras dicas

Aqui está uma solução que não requer um script auxiliar adicional. Você pode usar o seguinte shebang para diretamente invocar o kernel do Mathematica:

#!/bin/sh
exec <"$0" || exit; read; read; exec /usr/local/bin/math -noprompt "$@" | sed '/^$/d'; exit
(* Mathematica code starts here *)
x = 2+2;
Print[x];

O código shebang ignora as duas primeiras linhas do script e alimenta o resto para o kernel do Mathematica como entrada padrão. O sed comando elimina linhas vazias produzidas pelo kernel.

Este hack não é tão versátil como MASH . Como o código Mathematica é lida do stdin você não pode usar stdin para a entrada do usuário, ou seja, as funções entrada e InputString não fazer o trabalho.

Tente
-initfile nome
E colocar o comando de saída em seu programa

Assumindo que você adicionar os binários Mathematica para a variável de ambiente PATH em ~ / .profile,

export PATH=$PATH:/Applications/Mathematica.app/Contents/MacOS

Então você acabou de escrever esta linha shebang em seus scripts Mathematica.

#!/usr/bin/env MathKernel -script

Agora você pode dot-slash seus scripts.

$ cat hello.ma
#!/usr/bin/env MathKernel -script

Print["Hello World!"]

$ chmod a+x hello.ma
$ ./hello.ma
"Hello World!"

Testado com Mathematica 8.0.

Minor bug: Mathematica rodeia Imprimir [s] com citações em Windows e Mac OS X, mas não Linux. WTF?

Eu encontrei outra solução que funcionou para mim.

Salvar o código em um arquivo .m, em seguida, executá-lo como este: MathKernel -noprompt -run “<

Este é o link: http: //bergmanlab.smith. man.ac.uk/?p=38

Para mathematica 7

$ cat test.m
#!/bin/bash
MathKernel -noprompt -run < <( cat $0| sed -e '1,4d' )  | sed '1d'
exit 0
### code start Here ... ###
Print["Hello World!"]
X=7
X*5

Uso:

$ chmod +x test.m

$ ./test.m
"Hello World!"

7
35
Licenciado em: CC-BY-SA com atribuição
Não afiliado a StackOverflow
scroll top