Как оценить ноутбук из командной строки? - PullRequest
19 голосов
/ 28 декабря 2011

Как мы можем оценить записную книжку Mathematica из командной строки (т.е. при запуске ядра в режиме командной строки)?

Предположим, мы работаем на удаленной машине. Я знаю, что можно преобразовать записную книжку в m-файл и оценить это, но мне любопытно, можно ли сделать это напрямую с помощью записной книжки.


Это то, что я имею до сих пор:

Во-первых, нам нужно запустить безголовый X-сервер на удаленной машине с Linux, чтобы на нем мог работать внешний интерфейс (и открыть ноутбук). Пропустите этот шаг, если вы работаете на локальной машине.

Xvfb :1 &
export DISPLAY=:1

После этого я запустил ядро ​​Mathematica (math) и сделал следующее.

Необходимо использовать UsingFrontEnd, поскольку для открытия ноутбука требуется внешний интерфейс. test.nb имеет одну входную ячейку, содержащую a=1.

In[1]:= nb=UsingFrontEnd@NotebookOpen["test.nb"]

Out[1]= -NotebookObject-

После попытки оценить ноутбук, по-видимому, у меня появляется диалог , и мне нужно использовать Return[], чтобы вернуться. Я не уверен, почему строка ввода снова начинает считать с 1 (новое ядро ​​было запущено внешним интерфейсом?) Обратите внимание, что a не получил значения.

In[2]:= UsingFrontEnd@NotebookEvaluate[nb]

 In[1]:= a

 Out[1]= a

 In[2]:= Return[]

Out[2]= a

После возврата из диалогового окна a все еще не имеет значения.

In[3]:= a

Out[3]= a

Ответы [ 2 ]

11 голосов
/ 28 декабря 2011

Это частичный ответ на ваш вопрос.Следующий код открывает записную книжку, назначает ей «тестовое» ядро, оценивает записную книжку в этом ядре, ожидает завершения оценки и сохраняет оцененную записную книжку. не вызывает определение a в ядре локальной командной строки.

Это ожидает завершения оценки ядра в записной книжке:

NotebookPauseForEvaluation[nb_] := Module[{},
 While[ NotebookEvaluatingQ[nb], Pause[.25] ] ]

Это проверяет, находится ли какая-либо ячейка в блокноте на стадии оценки:

NotebookEvaluatingQ[nb_]:=Module[{},
 SelectionMove[nb,All,Notebook];
 Or@@Map["Evaluating"/.#&,Developer`CellInformation[nb]]
]

Это просто диагностическое сообщение, когда вы пытаетесь переопределить ядро, например «Test»:

AddTestEvaluator::exists = "Evaluator `1` is already defined, but has a definition that is `2` and not the expected `3`.";

Это код для добавления оценщика, например «Test», во внешний интерфейс:

AddTestEvaluator[evaluator_String] := Module[
 {evaluatornames, testevaluator},
 evaluatornames = EvaluatorNames /. Options[$FrontEnd, EvaluatorNames];
 testevaluator = evaluator -> {"AutoStartOnLaunch" -> False};
 Which[
  MemberQ[evaluatornames, evaluator -> {"AutoStartOnLaunch" -> False}],
  Null,
  MemberQ[evaluatornames, evaluator -> _],
  Message[AddTestEvaluator::exists,
  evaluator,
  evaluator /. (EvaluatorNames /. Options[$FrontEnd, EvaluatorNames]),
  {"AutoStartOnLaunch" -> False}
 ],
 True,
 AppendTo[evaluatornames, testevaluator];
 SetOptions[$FrontEnd, EvaluatorNames -> evaluatornames]
 ]
]

Наконец, это код для оценки записной книжки под «Test» ядром и сохранения оцененного ядра:

 UsingFrontEnd[     
  AddTestEvaluator["Test"];
  nb = NotebookOpen["test.nb"];
  SetOptions[nb,Evaluator->"Test"];
  SelectionMove[nb,All,Notebook];
  SelectionEvaluate[nb];
  NotebookPauseForEvaluation[nb];
  NotebookSave[nb]
 ]

Я все еще ищу решение вашей полной проблемы (определение a в локальном ядре командной строки).

10 голосов
/ 28 декабря 2011

Это в Windows, с хорошей работой Arnouds и просто добавлением простого старого MathLink (довольно медленно ...):

...