这是对你问题的部分回答。以下代码打开一个笔记本,为其分配一个“测试”内核,在该内核中评估笔记本,等待评估完成并保存已评估的笔记本。但它不会导致在本地命令行内核中定义a
。
这将等待笔记本中的内核评估完成:
NotebookPauseForEvaluation[nb_] := Module[{},
While[ NotebookEvaluatingQ[nb], Pause[.25] ] ]
这将检查笔记本中是否仍有任何单元格正在评估:
NotebookEvaluatingQ[nb_]:=Module[{},
SelectionMove[nb,All,Notebook]
Or@@Map["Evaluating"/.#&,Developer`CellInformation[nb]]
]
当您试图重新定义内核(例如"Test")时,这只是一条诊断消息:
AddTestEvaluator::exists = "Evaluator `1` is already defined, but has a definition that is `2` and not the expected `3`.";
这是添加一个像"Test"的评估器到前端的代码:
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]
]
]
最终,以下是使用“Test”内核评估笔记本并保存评估内核的代码:
UsingFrontEnd[
AddTestEvaluator["Test"];
nb = NotebookOpen["test.nb"];
SetOptions[nb,Evaluator->"Test"];
SelectionMove[nb,All,Notebook];
SelectionEvaluate[nb];
NotebookPauseForEvaluation[nb];
NotebookSave[nb]
]
我仍在寻找解决方案,以解决您的整个问题(即在本地命令行内核中定义a
)。