Appelez un programme Mathematica à partir de la ligne de commande, avec les arguments args, stdin, stdout et stderr de la ligne de commande
-
02-07-2019 - |
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.)?
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