wolfram mathematica - usar - ¿Cómo evaluar un cuaderno desde la línea de comando?
manual mathematica 11 español pdf (2)
¿Cómo podemos evaluar un cuaderno de Mathematica desde la línea de comandos (es decir, cuando ejecutamos el núcleo en el modo de línea de comandos)?
Supongamos que estamos trabajando en una máquina remota. Sé que es posible convertir el bloc de notas en un archivo-m, y evaluar eso, pero tengo curiosidad si es posible hacerlo directamente usando el bloc de notas.
Esto es lo que tengo hasta ahora:
Primero, debemos iniciar un servidor X sin cabeza en la máquina remota de Linux, para que la parte frontal pueda ejecutarse allí (y abrir la notebook). Omita este paso si está trabajando en una máquina local.
Xvfb :1 &
export DISPLAY=:1
Después de esto comencé un kernel de Mathematica ( math
) e hice lo siguiente.
Es necesario usar UsingFrontEnd
porque abrir una notebook requiere un extremo frontal. test.nb tiene una única celda de entrada que contiene a=1
.
In[1]:= nb=UsingFrontEnd@NotebookOpen["test.nb"]
Out[1]= -NotebookObject-
Después de intentar evaluar el cuaderno, aparentemente aparece un dialog y necesito usar Return[]
para volver. No estoy seguro de por qué la línea de entrada comienza a contar desde 1 otra vez (¿un nuevo núcleo fue iniciado por el extremo delantero?) Tenga en cuenta que no ganó un valor.
In[2]:= UsingFrontEnd@NotebookEvaluate[nb]
In[1]:= a
Out[1]= a
In[2]:= Return[]
Out[2]= a
Después de regresar del diálogo, a
fija no tiene un valor.
In[3]:= a
Out[3]= a
Esta es una respuesta parcial a su pregunta. El siguiente código abre un bloc de notas, le asigna un kernel "Test", evalúa el bloc de notas en ese kernel, espera a que finalice la evaluación y guarda el bloc de notas evaluado. Sin embargo, no causa que se defina en el kernel de la línea de comando local.
Esto espera a que las evaluaciones del núcleo terminen en el cuaderno:
NotebookPauseForEvaluation[nb_] := Module[{},
While[ NotebookEvaluatingQ[nb], Pause[.25] ] ]
Esto verifica si alguna celda en el cuaderno todavía está bajo evaluación:
NotebookEvaluatingQ[nb_]:=Module[{},
SelectionMove[nb,All,Notebook];
Or@@Map["Evaluating"/.#&,Developer`CellInformation[nb]]
]
Este es solo un mensaje de diagnóstico, cuando intenta redefinir un kernel como "Test":
AddTestEvaluator::exists = "Evaluator `1` is already defined, but has a definition that is `2` and not the expected `3`.";
Este es el código para agregar un evaluador, como "Prueba" a la interfaz:
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]
]
]
Finalmente, este es el código para evaluar un cuaderno bajo el kernel "Test" y guardar el kernel evaluado:
UsingFrontEnd[
AddTestEvaluator["Test"];
nb = NotebookOpen["test.nb"];
SetOptions[nb,Evaluator->"Test"];
SelectionMove[nb,All,Notebook];
SelectionEvaluate[nb];
NotebookPauseForEvaluation[nb];
NotebookSave[nb]
]
Todavía estoy buscando una solución para su problema completo (tener a
definido en el kernel de la línea de comando local).
Esto está en Windows, usando el buen trabajo de Arnouds y simplemente agregando MathLink antiguo (bastante lento por cierto ...):
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];
]