Я хотел бы начать писать несколько модульных тестов для моих программ Mathematica и управлять всем из командной строки с помощью некоторых Makefile.
Кажется, что можно запустить из командной строки, но я не вижу любые базовые инструкции по началу работы с Mac OS X - кто-нибудь делал это раньше?
Обновление:
Создание тестового файла вроде этого:
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, но надеюсь, что это не имеет значения.
3 ответа
Это, наконец, дает результат, которого я ожидал:
/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" ; }
См. Также Perl-скрипт dreeves mash
, который может иметь преимущества по сравнению с этим подходом.
Спасибо Пилси и Уиллу Робертсону за вилку 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 , а затем сделайте свой test.m следующим образом:
#!/usr/bin/env /path/to/mash.pl
prn["hello"];
x := 1;
y = x+1;
z = y+1;
prn["y=", y];
prn["z=", z];
Поэкспериментировав, я обнаружил, что /Applications/Mathematica.app/Contents/MacOS/MathKernel
можно запустить из командной строки. Однако, похоже, он не принимает обычные флаги командной строки -h
или --help
.
Похожие вопросы
Новые вопросы
command-line
Командная строка - это строка, передаваемая интерпретатору команд, которая сообщает ему о действиях, таких как запуск программ или копирование файлов. Интерпретатор обрабатывает командные строки с escape-символами и подстановками.