Llame a un programa de Mathematica desde la línea de comandos, con la línea de comandos args, stdin, stdout y stderr

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

Pregunta

Si tiene código de Mathematica en foo.m, se puede invocar a Mathematica con -noprompt y con -initfile foo.m (o -run "<<foo.m") y los argumentos de la línea de comandos están disponibles en $CommandLine (con basura adicional allí), pero ¿hay alguna manera de tener un código matemático 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.

y chmod es ejecutable y lo ejecuta? En otras palabras, ¿cómo se usa Mathematica como cualquier otro lenguaje de script (Perl, Python, Ruby, etc.)?

¿Fue útil?

Solución

MASH - Mathematica Scripting Hack - hará esto.

Desde la versión 6 de Mathematica, el siguiente script perl es suficiente:

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

Para versiones anteriores de Mathematica, se necesita un programa en C:

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

ACTUALIZACIÓN: Por fin, Mathematica 8 admite esto de forma nativa con el " -script " opción de línea de comandos:

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

Otros consejos

Aquí hay una solución que no requiere un script auxiliar adicional. Puede usar el siguiente shebang para invocar directamente el núcleo de 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];

El código shebang omite las dos primeras líneas del script y alimenta el resto al núcleo de Mathematica como entrada estándar. El comando sed elimina las líneas vacías producidas por el núcleo.

Este truco no es tan versátil como MASH . Debido a que el código de Mathematica se lee desde stdin no puede usar stdin para la entrada del usuario, es decir, las funciones Entrada y InputString no funciona.

Prueba
-initfile nombre de archivo
Y ponga el comando de salida en su programa

Suponiendo que agrega los binarios de Mathematica a la variable de entorno PATH en ~ / .profile,

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

Luego, simplemente escriba esta línea shebang en sus scripts de Mathematica.

#!/usr/bin/env MathKernel -script

Ahora puede reducir sus scripts a puntos.

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

Print["Hello World!"]

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

Probado con Mathematica 8.0.

Error menor: Mathematica rodea a Print [s] con comillas en Windows y Mac OS X, pero no en Linux. WTF?

Encontré otra solución que funcionó para mí.

Guarde el código en un archivo .m, luego ejecútelo así: MathKernel -noprompt -run & # 8220; <

Este es el enlace: http: //bergmanlab.smith. man.ac.uk/?p=38

Para Mathica 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 bajo: CC-BY-SA con atribución
No afiliado a StackOverflow
scroll top