2011-10-02 12 views
5

Ta przykładowa procedura generuje dwa komunikaty ostrzegawcze Throw :: nocatch w oknie jądra. Czy jakoś można nimi manipulować?Uncaught Throw generowany przez JLink lub UseFrontEnd

Przykład składa się z tego kodu w pliku "test.m" stworzonego w katalogu C: \ Temp:

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

Następnie komendy te wklejane i uruchomić w wierszu polecenia systemu Windows:

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

enter image description here

Uzupełnienie

Powodem używania UseFrontEnd w przeciwieństwie do UseFrontEnd jest to, że interaktywny interfejs może być wymagany do zachowania danych wyjściowych i komunikatów z notebooków, które są zwykle uruchamiane interaktywnie. Na przykład, C: \ temp \ test.m zmodyfikowany tak:

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

i notebook C: \ temp \ run.nb utworzone z pojedynczej komórki, zawierający:

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

ten kod , uruchomione z wiersza poleceń systemu Windows, uruchomi się interaktywnie i zapisze dane wyjściowe. Nie można tego osiągnąć za pomocą UsingFrontEnd lub MathKernel -script "C: \ Temp \ test.m".

+0

@ Leonid, Działa również z poziomu okna jądra. Problem wydaje się być pewną interakcją między metodą -initfile i JLink. Nie ma żadnych wiadomości za pomocą -script, ale to nie działa tak, jak chcę. Aktualnie na M8.0.1 XP SP3. Wypróbuję jutro inną maszynę. –

+0

Przepraszam - w jakiś sposób przegapiłem te błędy. Teraz je odtworzyć. Nie mam pojęcia, dlaczego wcześniej ich nie zauważyłem. –

Odpowiedz

5

Podczas inicjalizacji kod jądra znajduje się w trybie, który zapobiega przerywaniu.

Throw/Catch są realizowane z przerwaniem, dlatego nie działają podczas inicjowania.

Prostym przykładem, który pokazuje problem jest umieszczenie tego w pliku test.m:

Catch[Throw[test]]; 

Podobnie funkcje jak TimeConstrained, MemoryConstrained, złamać, rodziny śladu, Abort i te, które zależą od niego (podobnie jak niektóre pakiety danych) będą mieć podobne problemy podczas inicjalizacji.

Możliwym rozwiązaniem problemu może być rozważenie opcji -script:

math.exe -script test.m 

Należy również pamiętać, że w wersji 8 istnieje udokumentowana funkcja nazywa UsingFrontEnd, który robi to, co UseFrontEnd zrobił, ale to auto -konfigurowane, więc:

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

powinno być wszystko, czego potrzebujesz w pliku test.m.

Zobacz także: Mathematica Scripts

Uzupełnienie

jednym z możliwych rozwiązań, aby skorzystać z -script i UsingFrontEnd jest użycie „skrypt run.m zawarte poniżej. Wymaga to ustawienia jądra "Test" w opcjach konfiguracji jądra (w zasadzie klon "Lokalnych" ustawień jądra).

Skrypt zawiera dwie funkcje narzędziowe: NotebookEvaluatingQ i NotebookPauseForEvaluation, które pomagają skryptowi czekać na zakończenie analizy przez notatnik klienta przed jego zapisaniem. Zaletą tego podejścia jest to, że cały kod kontroli ewaluacji znajduje się w skrypcie "run.m", więc notatnik klienta nie musi mieć na końcu instrukcji NotesSave [EvaluationNotebook []].

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

NotebookEvaluatingQ[nb_]:=Module[{}, 
SelectionMove[nb,All,Notebook]; 
[email protected]@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]; 
] 

Mam nadzieję, że przydaje się to w jakiś sposób. Może użyć kilku dodatkowych usprawnień, takich jak przywrócenie pierwotnego jądra komputera do notebooka i zamknięcie go po zapisaniu, ale ten kod powinien działać w tym konkretnym celu.

Na marginesie, próbowałem jeszcze jedno podejście, za pomocą tego:

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

Ale to jest kopanie sesję terminala jądra w trybie dialogowym, które wydaje się być błędem do mnie (będę sprawdź to i otrzymaj zgłoszenie, jeśli jest to ważny problem).

+0

@ Arnoud, Dzięki za wyjaśnienie. Używam UseFrontEnd do uruchomienia interaktywnego interfejsu do przechwytywania danych wyjściowych, jak pokazano w dodanym addendum. Ani UsingFrontEnd, ani MathKernel -script nie ułatwiają tego, więc planuję kontynuować używanie UseFrontEnd, ale z komunikatami ostrzegania nocatch. –

+0

@ Arnoud, Metoda "NotebookEvaluatingQ" jest interesująca. –

Powiązane problemy