5

このサンプル ルーチンは、カーネル ウィンドウに 2 つの Throw::nocatch 警告メッセージを生成します。それらはどうにかして処理できますか?

この例は、C:\Temp に作成されたファイル「test.m」内の次のコードで構成されています。

Needs["JLink`"];
$FrontEndLaunchCommand = "Mathematica.exe";
UseFrontEnd[NotebookWrite[CreateDocument[], "Testing"]];

次に、これらのコマンドを貼り付けて、Windows コマンド プロンプトで実行します。

PATH = C:\Program Files\Wolfram Research\Mathematica\8.0\;%PATH%
start MathKernel -noprompt -initfile "C:\Temp\test.m"

ここに画像の説明を入力

補遺

UsingFrontEnd ではなく UseFrontEnd を使用する理由は、通常は対話的に実行されるノートブックからの出力とメッセージを保持するために対話型フロント エンドが必要になる場合があるためです。たとえば、 C:\Temp\test.m を次のように変更します。

Needs["JLink`"];
$FrontEndLaunchCommand="Mathematica.exe";
UseFrontEnd[
nb = NotebookOpen["C:\\Temp\\run.nb"];
SelectionMove[nb, Next, Cell];
SelectionEvaluate[nb];
];
Pause[10];
CloseFrontEnd[];

および以下を含む単一のセルで作成されたノートブック C:\Temp\run.nb:

x1 = 0; While[x1 < 1000000,
 If[Mod[x1, 100000] == 0,
  Print["x1=" <> ToString[x1]]]; x1++];
NotebookSave[EvaluationNotebook[]];
NotebookClose[EvaluationNotebook[]];

このコードは、Windows コマンド プロンプトから起動され、対話的に実行され、その出力が保存されます。これは、UsingFrontEnd または MathKernel -script "C:\Temp\test.m" を使用して達成することはできません。

4

1 に答える 1

5

初期化中、カーネル コードはアボートを防止するモードになります。

Throw/Catch は Abort で実装されるため、初期化中は機能しません。

問題を示す簡単な例は、これを test.m ファイルに入れることです。

Catch[Throw[test]];

同様に、TimeConstrained、MemoryConstrained、Break、Trace ファミリ、Abort などの関数、およびそれに依存する関数 (特定のデータ パクレットなど) には、初期化中にこのような問題が発生します。

問題の可能な解決策は、-script オプションを検討することです。

math.exe -script test.m

また、バージョン 8 には、UsingFrontEnd と呼ばれる文書化された関数があることに注意してください。

Needs["JLink`"];
UsingFrontEnd[NotebookWrite[CreateDocument[], "Testing"]];

test.m ファイルで必要なのはこれだけです。

参照: Mathematica スクリプト

補遺

-script と UsingFrontEnd を使用する解決策の 1 つは、以下に含まれる 'run.m スクリプトを使用することです。これには、カーネル構成オプションで「テスト」カーネルを設定する必要があります (基本的には「ローカル」カーネル設定のクローン)。

スクリプトには NotebookEvaluatingQ と NotebookPauseForEvaluation の 2 つのユーティリティ関数が含まれており、クライアント ノートブックの評価が終了してから保存するまでスクリプトを待機させることができます。このアプローチの利点は、すべての評価制御コードが 'run.m' スクリプトにあるため、クライアント ノートブックの最後に NotebookSave[EvaluationNotebook[]] ステートメントを含める必要がないことです。

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

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

UsingFrontEnd[
nb = NotebookOpen["c:\\users\\arnoudb\\run.nb"];
SetOptions[nb,Evaluator->"Test"];
SelectionMove[nb,All,Notebook];
SelectionEvaluate[nb];
NotebookPauseForEvaluation[nb];
NotebookSave[nb];
]

これが何らかの形で役立つことを願っています。ノートブックのカーネルを元の状態にリセットし、保存後にノートブックを閉じるなど、さらにいくつかの改善を使用できますが、このコードはこの特定の目的で機能するはずです。

余談ですが、これを使用して別のアプローチを試しました:

UsingFrontEnd[ NotebookEvaluate[ "c:\\users\\arnoudb\\run.nb", InsertResults->True ] ]

しかし、これはカーネル ターミナル セッションをダイアログ モードに切り替えます。これはバグのように思えます (これを調べて、これが有効な問題である場合は報告します)。

于 2011-11-08T17:05:54.763 に答える