首页
学习
活动
专区
圈层
工具
发布
首页
学习
活动
专区
圈层
工具
MCP广场
社区首页 >问答首页 >如何从命令行评估笔记本?

如何从命令行评估笔记本?
EN

Stack Overflow用户
提问于 2011-12-28 14:43:53
回答 2查看 5.2K关注 0票数 19

我们如何从命令行(即在命令行模式下运行内核时)来评估Mathematica笔记本呢?

假设我们在遥控机器上工作。我知道将笔记本转换成m文件是可能的,并对此进行评估,但我很好奇是否可以直接使用笔记本来完成这个任务。

到目前为止,这就是我所拥有的:

首先,在远程Linux机器上运行我们需要启动一个无头X服务器,这样前端就可以在那里运行(并打开笔记本)。如果您在本地机器上工作,请跳过此步骤。

代码语言:javascript
运行
复制
Xvfb :1 &
export DISPLAY=:1

在此之后,我启动了Mathematica内核(math),并执行了以下操作。

使用UsingFrontEnd是必要的,因为打开笔记本需要一个前端。test.nb有一个包含a=1的输入单元。

代码语言:javascript
运行
复制
In[1]:= nb=UsingFrontEnd@NotebookOpen["test.nb"]

Out[1]= -NotebookObject-

在尝试评估笔记本之后,显然我得到了一个对话框,我需要使用Return[]返回。我不知道为什么输入行再次从1开始计数(在前端启动了一个新内核?)请注意,a没有获得一个值。

代码语言:javascript
运行
复制
In[2]:= UsingFrontEnd@NotebookEvaluate[nb]

 In[1]:= a

 Out[1]= a

 In[2]:= Return[]

Out[2]= a

从对话框返回后,a仍然没有值。

代码语言:javascript
运行
复制
In[3]:= a

Out[3]= a
EN

回答 2

Stack Overflow用户

回答已采纳

发布于 2011-12-28 18:40:31

这是在Windows上,使用Arnoud出色的工作,只添加普通的旧MathLink (非常慢的一点.):

代码语言:javascript
运行
复制
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];
]
票数 10
EN

Stack Overflow用户

发布于 2011-12-28 17:17:48

这是对你问题的部分回答。下面的代码打开一个笔记本,为它分配一个“测试”内核,评估内核中的笔记本,等待评估完成,并保存评估笔记本。但是,它不会导致在本地命令行内核中定义a

这将等待在笔记本中完成内核评估:

代码语言:javascript
运行
复制
NotebookPauseForEvaluation[nb_] := Module[{},
 While[ NotebookEvaluatingQ[nb], Pause[.25] ] ]

这将检查笔记本中是否有任何单元格仍在评估中:

代码语言:javascript
运行
复制
NotebookEvaluatingQ[nb_]:=Module[{},
 SelectionMove[nb,All,Notebook];
 Or@@Map["Evaluating"/.#&,Developer`CellInformation[nb]]
]

当您试图重新定义像“Test”这样的内核时,这只是一条诊断信息:

代码语言:javascript
运行
复制
AddTestEvaluator::exists = "Evaluator `1` is already defined, but has a definition that is `2` and not the expected `3`.";

这是将评估器添加到前端的代码,如“测试”:

代码语言:javascript
运行
复制
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]
 ]
]

最后,这是在“测试”内核下评估笔记本并保存评估内核的代码:

代码语言:javascript
运行
复制
 UsingFrontEnd[     
  AddTestEvaluator["Test"];
  nb = NotebookOpen["test.nb"];
  SetOptions[nb,Evaluator->"Test"];
  SelectionMove[nb,All,Notebook];
  SelectionEvaluate[nb];
  NotebookPauseForEvaluation[nb];
  NotebookSave[nb]
 ]

我仍然在为您的全部问题寻找解决方案(在本地命令行内核中定义了a )。

票数 11
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/8657275

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档