Вызов программы Mathematica из командной строки с аргументами командной строки, stdin, stdout и stderr.

Если у вас есть код Mathematica в foo.m, Mathematica может быть вызвана с помощью -noprompt и с -initfile foo.m (или -run "<<foo.m"), а аргументы командной строки доступны в $CommandLine (с дополнительным мусором там), но есть ли способ просто иметь некоторый код mathematica как

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

и chmod это исполняемый файл и запустить его? Другими словами, как можно использовать Mathematica, как и любой другой язык сценариев (Perl, Python, Ruby и т. д.)?


person Community    schedule 29.09.2008    source источник


Ответы (5)


MASH -- Mathematica Scripting Hack -- сделает это.

Начиная с Mathematica версии 6, достаточно следующего Perl-скрипта:

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

Для предыдущих версий Mathematica требуется программа на C:

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

ОБНОВЛЕНИЕ: наконец, Mathematica 8 изначально поддерживает это с помощью параметра командной строки «-script»:

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

person Community    schedule 30.09.2008

Вот решение, которое не требует дополнительного вспомогательного скрипта. Вы можете использовать следующий шебанг для прямого вызова ядра 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];

Код shebang пропускает первые две строки скрипта и передает остальные в ядро ​​Mathematica в качестве стандартного ввода. Команда sed удаляет пустые строки, созданные ядром.

Этот хак не так универсален, как MASH. Поскольку код Mathematica считывается из stdin, вы не можете использовать stdin для пользовательского ввода, т. е. функции Ввод и ВводСтрока не работают.

person Community    schedule 14.08.2010

Предполагая, что вы добавляете бинарные файлы Mathematica в переменную окружения PATH в ~/.profile,

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

Затем вы просто пишете эту строку шебанга в своих сценариях Mathematica.

#!/usr/bin/env MathKernel -script

Теперь вы можете использовать косую черту в своих сценариях.

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

Print["Hello World!"]

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

Протестировано с Mathematica 8.0.

Незначительная ошибка: Mathematica заключает Print[s] в кавычки в Windows и Mac OS X, но не в Linux. ВТФ?

person Community    schedule 01.11.2011

Попробуйте
-initfile имя файла
и поместите команду выхода в свою программу

person Lev    schedule 29.09.2008
comment
Спасибо, это улучшение по сравнению с -run. Я обновил вопрос. У меня есть то, что я считаю более полным решением, которое я скоро опубликую. - person dreeves; 29.09.2008
comment
В моем решении mash.pl оказывается, что вам нужно использовать -run, а не -initfile. Я не уверен, почему, но последнее вызывает проблемы со скриптами Mathematica, которые читаются из файлов. - person dreeves; 02.10.2008

Для математики 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

Использование:

$ chmod +x test.m

$ ./test.m
"Hello World!"

7
35
person Community    schedule 16.02.2013