Mathematica en mode de traitement par lots à partir de la ligne de commande sous Mac OS X
-
05-07-2019 - |
Question
J'aimerais commencer à écrire des tests unitaires pour mes programmes Mathematica et tout contrôler à partir de la ligne de commande à l'aide de fichiers Makefiles.
Il semble que puisse être exécuté à partir de la ligne de commande , mais que je peux l'exécuter. ne voyez aucune instruction de base pour commencer à utiliser Mac OS X. Est-ce que quelqu'un l'a déjà fait?
Mise à jour:
Création d'un fichier de test comme celui-ci:
Print["hello"]; x := 1; y = x+1; z = y+1; Print["y="ToString@y]; Print["z="ToString@z]; Quit[];
Et l'exécuter avec
/Applications/Mathematica.app/Contents/MacOS/MathKernel -noprompt < test.m
est ce qui me rapproche le plus du traitement par lots. La sortie semble moche, cependant; Des nouvelles lignes sont ajoutées pour chaque ligne du script!
"hello" "y=2" "z=3"
Est-ce la chose la plus proche que je puisse obtenir d'un script qui peut toujours afficher des informations sur la sortie de la console? J'utilise seulement Mathematica 6, mais j'espère que cela ne fera aucune différence.
La solution
Ceci, enfin, donne la sortie comme je l’attendais:
/Applications/Mathematica.app/Contents/MacOS/MathKernel -noprompt -run "<<test.m"
Ça a du sens, je suppose. Ajouter ceci à mon .bash_profile
permet une exécution facile (comme dans mma test.m
):
mma () { /Applications/Mathematica.app/Contents/MacOS/MathKernel -noprompt -run "<<$1" ; }
Voir aussi Le mash
de dreeves qui offre des avantages par rapport à cette approche.
Autres conseils
Avec quelques expériences, j'ai trouvé que /Applications/Mathematica.app/Contents/MacOS/MathKernel
peut être lancé à partir de la ligne de commande. Il ne semble pas accepter les indicateurs de ligne de commande -h
ou - help
habituels, bien que.
Merci à Pillsy et Will Robertson pour la prise MASH! Voici la question pertinente de StackOverflow: Appelez un programme Mathematica à partir de la ligne de commande, avec les arguments de ligne de commande, stdin , stdout et stderr
Si vous n'utilisez pas MASH, vous souhaiterez peut-être utiliser les fonctions utilitaires suivantes définies par MASH. Par exemple, l’impression standard imprimera des chaînes avec des guillemets - ce n’est pas ce que vous voulez dans les scripts.
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[] *)
Most@NestWhileList[f[]&, f[], test]; (* returns while test is true. *)
readList[] := doList[read, #=!=EOF&]; (* Slurp list'o'lines from stdin *)
Pour utiliser MASH, saisissez simplement ce fichier Perl, mash.pl , puis configurez votre test.m comme suit:
#!/usr/bin/env /path/to/mash.pl
prn["hello"];
x := 1;
y = x+1;
z = y+1;
prn["y=", y];
prn["z=", z];