Mathematica в пакетном режиме из командной строки на Mac OS X
-
05-07-2019 - |
Вопрос
Я бы хотел начать писать модульные тесты для моих программ на Mathematica и управлять всем из командной строки с помощью некоторых Makefile.
Похоже, что Mathematica можно запустить из командной строки , но я могу не вижу никаких основных инструкций по началу работы с этим на Mac OS X & # 8212; кто-нибудь делал это раньше?
<Ч>Обновление:
Создание тестового файла следующим образом:
Print["hello"]; x := 1; y = x+1; z = y+1; Print["y="ToString@y]; Print["z="ToString@z]; Quit[];
И запустить его с
/Applications/Mathematica.app/Contents/MacOS/MathKernel -noprompt < test.m
- самый близкий к какой-либо пакетной обработке. Вывод выглядит ужасно, хотя; Новые строки добавляются для каждой строки скрипта!
"hello" "y=2" "z=3"
Это самая близкая вещь, которую я могу получить к сценарию, который все еще может выводить информацию на вывод консоли? Я использую только Mathematica 6, но надеюсь, что это ничего не изменит.
Решение
Это, наконец, дает вывод, как я ожидал:
/Applications/Mathematica.app/Contents/MacOS/MathKernel -noprompt -run "<<test.m"
Думаю, имеет смысл. Добавление этого в мой .bash_profile
позволяет легко выполнить (как в mma test.m
):
mma () { /Applications/Mathematica.app/Contents/MacOS/MathKernel -noprompt -run "<<$1" ; }
См. также скрипт dreeves mash
Perl, который может предложить преимущества по сравнению с этим подходом.
Другие советы
После некоторых экспериментов я обнаружил, что /Applications/Mathematica.app/Contents/MacOS/MathKernel
можно запустить из командной строки. Однако он не принимает обычные флаги командной строки -h
или - help
.
Спасибо Пилли и Уиллу Робертсону за пробку MASH! Вот соответствующий вопрос StackOverflow: Вызов программы Mathematica из командной строки с аргументами командной строки, stdin , stdout и stderr
Если вы не используете MASH, вы можете использовать следующие служебные функции, которые определяет MASH. Например, стандартный Print будет печатать строки с кавычками - обычно это не то, что вам нужно в скриптах.
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 *)
Чтобы использовать MASH, просто скачайте этот perl-файл, mash.pl , а затем сделайте свой тест.m следующим образом:
#!/usr/bin/env /path/to/mash.pl
prn["hello"];
x := 1;
y = x+1;
z = y+1;
prn["y=", y];
prn["z=", z];