2009-10-22 13 views
6

Me gustaría comenzar a escribir algunas pruebas unitarias para mis programas de Mathematica y controlar todo desde la línea de comandos con algunos Makefiles.Mathematica en modo por lotes desde la línea de comandos en Mac OS X

Parece que Mathematica can be run from the command line pero no veo instrucciones básicas para comenzar a hacer esto en Mac OS X. ¿Alguien ha hecho esto antes?


Actualización:

La creación de un archivo de prueba de la siguiente manera:

 
Print["hello"]; 
x := 1; 
y = x+1; 
z = y+1; 
Print["y="[email protected]]; 
Print["z="[email protected]]; 
Quit[]; 

y ejecutarlo con

/Applications/Mathematica.app/Contents/MacOS/MathKernel -noprompt < test.m 

es el más cercano que puedo llegar a algún tipo de procesamiento por lotes. Sin embargo, el resultado parece feo; ¡se agregan nuevas líneas para cada línea del script!

 

"hello" 




"y=2" 

"z=3" 

¿Es esto lo más parecido que puedo obtener a un script que todavía puede mostrar información en la salida de la consola? Solo estoy usando Mathematica 6, pero espero que eso no haga la diferencia.

+0

¿Has mirado en puré: http: //ai.eecs. umich.edu/people/dreeves/mash/? – Pillsy

Respuesta

3

Esto, finalmente, da salida como yo esperaría que:

/Applications/Mathematica.app/Contents/MacOS/MathKernel -noprompt -run "<<test.m" 

tiene sentido, supongo. La adición de este a mi .bash_profile permite un fácil ejecución (como en mma test.m):

mma() { /Applications/Mathematica.app/Contents/MacOS/MathKernel -noprompt -run "<<$1" ; } 

Ver también dreeves's mash script en Perl, lo que puede ofrecer ventajas con respecto a este enfoque.

2

Con un poco de experimentación, encontré que /Applications/Mathematica.app/Contents/MacOS/MathKernel se puede iniciar desde la línea de comandos. Sin embargo, no parece aceptar los indicadores de línea de comandos -h o --help.

0

¡Gracias a Pillsy y Will Robertson por el enchufe MASH! Aquí está la pregunta relevante de StackOverflow: Call a Mathematica program from the command line, with command-line args, stdin, stdout, and stderr

Si no usa MASH, es posible que desee utilizar las siguientes funciones de utilidad que define MASH. Por ejemplo, la impresión estándar imprimirá cadenas con comillas, generalmente no es lo que quiere en las secuencias de comandos.

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[] *) 
    [email protected][f[]&, f[], test];  (* returns while test is true. *) 
readList[] := doList[read, #=!=EOF&];  (* Slurp list'o'lines from stdin *) 

Para utilizar MASH, sólo tienes que tomar ese archivo Perl, mash.pl, y luego hacer su test.m como la siguiente:

#!/usr/bin/env /path/to/mash.pl 

prn["hello"]; 
x := 1; 
y = x+1; 
z = y+1; 
prn["y=", y]; 
prn["z=", z]; 
Cuestiones relacionadas