Appelez un programme Mathematica à partir de la ligne de commande, avec les arguments args, stdin, stdout et stderr de la ligne de commande

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

Question

Si vous avez du code Mathematica dans foo.m, vous pouvez appeler Mathematica avec -noprompt et avec -initfile foo.m (ou -run "<<foo.m") et les arguments de ligne de commande sont disponibles dans $CommandLine (avec de la malbouffe supplémentaire), mais existe-t-il un moyen d’avoir un code mathematica tel que

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

et chmod l'exécutable et l'exécuter? En d’autres termes, comment utiliser Mathematica comme tout autre langage de script (Perl, Python, Ruby, etc.)?

Était-ce utile?

La solution

MASH - Mathematica Scripting Hack - le fera.

Depuis Mathematica version 6, le script Perl suivant suffit:

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

Pour les versions précédentes de Mathematica, un programme C est nécessaire:

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

UPDATE: Mathematica 8 prend enfin en charge cette fonctionnalité de manière native avec le " -script " option de ligne de commande:

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

Autres conseils

Voici une solution qui ne nécessite pas de script d'assistance supplémentaire. Vous pouvez utiliser le shebang suivant pour appeler directement le noyau 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];

Le code shebang ignore les deux premières lignes du script et transmet le reste au noyau Mathematica en tant qu'entrée standard. La commande sed supprime les lignes vides produites par le noyau.

Ce hack n’est pas aussi polyvalent que MASH . Le code Mathematica étant lu depuis stdin , vous ne pouvez pas utiliser stdin pour la saisie utilisateur, c’est-à-dire que les fonctions Entrée et InputString ne fonctionne pas.

Essayez
-initfile nom_fichier
Et mettez la commande de sortie dans votre programme

En supposant que vous ajoutiez les fichiers binaires Mathematica à la variable d'environnement PATH dans ~ / .profile,

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

Ensuite, vous écrivez simplement cette ligne shebang dans vos scripts Mathematica.

#!/usr/bin/env MathKernel -script

Maintenant, vous pouvez décaper vos scripts.

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

Print["Hello World!"]

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

Testé avec Mathematica 8.0.

Bug mineur: Mathematica entoure Print [s] de guillemets dans Windows et Mac OS X, mais pas Linux. WTF?

J'ai trouvé une autre solution qui a fonctionné pour moi.

Enregistrez le code dans un fichier .m, puis exécutez-le comme suit: MathKernel -noprompt -run & # 8220; <

C'est le lien: http: //bergmanlab.smith. man.ac.uk/?p=38

Pour 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

Utilisation:

$ chmod +x test.m

$ ./test.m
"Hello World!"

7
35
Licencié sous: CC-BY-SA avec attribution
Non affilié à StackOverflow
scroll top