19

コマンドラインから(つまり、カーネルをコマンドラインモードで実行しているときに)Mathematicaノートブックをどのように評価できますか?

リモートマシンで作業しているとします。ノートブックをm-fileに変換して評価することは可能ですが、ノートブックを使用して直接これを行うことができるかどうか知りたいです。


これは私がこれまでに持っているものです:

まず、リモートLinuxマシンでヘッドレスXサーバーを起動して、フロントエンドをそこで実行できるようにする(そしてノートブックを開く)必要があります。ローカルマシンで作業している場合は、この手順をスキップしてください。

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
4

2 に答える 2

11

これはあなたの質問に対する部分的な答えです。次のコードは、ノートブックを開き、「テスト」カーネルを割り当て、そのカーネルでノートブックを評価し、評価が終了するのを待って、評価されたノートブックを保存します。ただし、ローカルコマンドラインカーネルで定義されることはありません。a

これは、ノートブックでカーネル評価が終了するのを待ちます。

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

これにより、ノートブックのセルがまだ評価中であるかどうかがチェックされます。

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

これは、「テスト」のようなカーネルを再定義しようとしている場合の単なる診断メッセージです。

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

これは、「テスト」などの評価者をフロントエンドに追加するためのコードです。

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]
 ]
]

最後に、これは「テスト」カーネルの下でノートブックを評価し、評価されたカーネルを保存するためのコードです。

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

私はまだあなたの完全な問題の解決策を探しています(aローカルコマンドラインカーネルで定義されています)。

于 2011-12-28T17:17:48.810 に答える
10

これはWindowsで、Arnoudsのすばらしい作業を使用し、単純な古いMathLinkを追加するだけです(かなり遅いですが...):

link = LinkCreate["8000", LinkProtocol -> "TCPIP"];
UsingFrontEnd[
NotebookPauseForEvaluation[nb_] := Module[{},
 While[ NotebookEvaluatingQ[nb], Pause[.25] ] ];
NotebookEvaluatingQ[nb_]:=Module[{},
 SelectionMove[nb,All,Notebook];
 Or@@Map["Evaluating"/.#&,Developer`CellInformation[nb]]
];
nb = NotebookOpen["G:\\mma\\test.nb"];
SelectionMove[nb, Before, Notebook];
NotebookWrite[nb, Cell["Link = LinkConnect[\"8000\", LinkProtocol -> \"TCPIP\"]", "Input"]];
SelectionMove[nb, After, Notebook];
NotebookWrite[nb, Cell["LinkWrite[Link, a]", "Input"]];
SelectionMove[nb, All, Notebook];
SelectionEvaluate[nb];
a = LinkRead[link];
Print["a = ",a];
]
于 2011-12-28T18:40:31.840 に答える