2011-10-02 9 views
5

Esta rutina de ejemplo genera dos mensajes de advertencia Throw :: nocatch en la ventana del kernel. Pueden ser manejados de alguna manera?Tiro no capturado generado por JLink o UseFrontEnd

El ejemplo consiste en este código en un archivo "test.m" creado en C: \ Temp:

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

Entonces estos comandos pegados y ejecutar en el símbolo del sistema de Windows:

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

enter image description here

Adición

La razón para utilizar UseFrontEnd en lugar de utilizar FrontEnd es que se necesita un front-end interactivo para conservar la salida y los mensajes de los portátiles que generalmente se ejecutan de forma interactiva. Por ejemplo, con C: \ Temp \ test.m modificado así:

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

y un cuaderno C: \ Temp \ run.nb creado con una sola célula que contiene:

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

este código , lanzado desde un símbolo del sistema de Windows, se ejecutará de forma interactiva y guardará su resultado. Esto no es posible con UsingFrontEnd o MathKernel -script "C: \ Temp \ test.m".

+0

@ Leonid, Funciona bien desde la ventana del kernel aquí también. El problema parece ser cierta interacción entre el método de entrada de archivos y JLink. No hay mensajes usando -script, pero eso no funciona como yo quiero. Actualmente en M8.0.1 XP SP3. Intentaremos una máquina diferente mañana. –

+0

Lo siento, simplemente me perdí esos errores de alguna manera. Los reproduzco ahora. No tengo idea de por qué no los había notado antes. –

Respuesta

5

Durante la inicialización, el código del núcleo está en un modo que evita interrupciones.

Throw/Catch se implementan con Abort, por lo tanto, no funcionan durante la inicialización.

Un simple ejemplo que muestra el problema es poner esto en su archivo test.m:

Catch[Throw[test]]; 

Del mismo modo, funciona como TimeConstrained, MemoryConstrained, Pausa, la familia Trace, Abortar y las que dependen de ella (como ciertos paclets de datos) tendrá problemas como este durante la inicialización.

Una posible solución a su problema podría ser la de considerar la opción -script:

math.exe -script test.m 

Además, cabe destacar que en la versión 8 hay una función llamada documentado UsingFrontEnd, que hace lo que hizo UseFrontEnd, pero es auto -configurado, así que esto:

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

debe ser todo lo que necesita en su archivo test.m.

Consulte también: Mathematica Scripts

Adición

Una solución posible utilizar el -script y UsingFrontEnd es utilizar el 'guión run.m se incluye a continuación. Esto requiere configurar un kernel de 'Prueba' en las opciones de configuración del kernel (básicamente una clonación de la configuración 'Local' del kernel).

El script incluye dos funciones de utilidad, NotebookEvaluatingQ y NotebookPauseForEvaluation, que ayudan al script a esperar a que el notebook del cliente finalice la evaluación antes de guardarlo. Lo bueno de este enfoque es que todo el código de control de evaluación se encuentra en el script 'run.m', por lo que el cuaderno del cliente no necesita tener una sentencia NotebookSave [EvaluationNotebook []] al final.

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

Espero que esto sea de alguna manera útil para usted. Podría usar algunas mejoras más, como restablecer el kernel del portátil a su original y cerrar el portátil después de guardarlo, , pero este código debería funcionar para este propósito particular.

En una nota lateral, he intentado otro enfoque, el uso de este:

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

Pero esto es patear la sesión de terminal del núcleo en un modo de diálogo, que parece como un insecto a mí (me voy verifique esto y obtenga esta información si este es un problema válido).

+0

@ Arnoud, gracias por la explicación. Estoy usando UseFrontEnd para iniciar una interfaz interactiva para capturar resultados, como se muestra en el apéndice que acabo de agregar. Ni UsingFrontEnd ni MathKernel -script lo facilita, así que planeo seguir usando UseFrontEnd aunque con mensajes de advertencia de nocatch. –

+0

@ Arnoud, el método 'NotebookEvaluatingQ' es interesante. –

Cuestiones relacionadas