2011-12-28 24 views
19

हम कमांड लाइन से गणित नोटबुक का मूल्यांकन कैसे कर सकते हैं (यानी कमांड लाइन मोड में कर्नेल चलाते समय)?कमांड लाइन से नोटबुक का मूल्यांकन कैसे करें?

मान लीजिए कि हम एक दूरस्थ मशीन पर काम कर रहे हैं। मुझे पता है कि नोटबुक को एम-फाइल में कनवर्ट करना संभव है, और उसका मूल्यांकन करना संभव है, लेकिन अगर मैं नोटबुक का उपयोग कर सीधे ऐसा करना संभव हूं तो मुझे उत्सुकता है।


यह वही है मैं अब तक है:

पहले, we need to start a headless X server दूरस्थ Linux मशीन पर है, तो सामने के छोर वहाँ चला सकते हैं (और नोटबुक खोलने के लिए)। यदि आप स्थानीय मशीन पर काम कर रहे हैं तो इस चरण को छोड़ें।

Xvfb :1 & 
export DISPLAY=:1 

इस के बाद मैं एक मेथेमेटिका गिरी (math) शुरू किया और निम्नलिखित किया था।

UsingFrontEnd का उपयोग करना आवश्यक है क्योंकि नोटबुक खोलने के लिए फ्रंट एंड की आवश्यकता होती है। test.nb में एक एकल इनपुट सेल है जिसमें a=1 है।

In[1]:= [email protected]["test.nb"] 

Out[1]= -NotebookObject- 

नोटबुक का मूल्यांकन करने की कोशिश के बाद, जाहिरा तौर पर मैं एक dialog मिलता है, और मैं Return[] उपयोग करने के लिए वापस जाने के लिए की जरूरत है। मुझे यकीन नहीं है कि क्यों इनपुट लाइन 1 से फिर से गिनती शुरू कर रही है (फ्रंट कर्नेल द्वारा एक नया कर्नेल शुरू किया गया था?) ध्यान दें कि a को कोई मूल्य नहीं मिला।

In[2]:= [email protected][nb] 

In[1]:= a 

Out[1]= a 

In[2]:= Return[] 

Out[2]= a 

संवाद से लौटने के बाद a अभी भी एक मूल्य नहीं है।

In[3]:= a 

Out[3]= a 
+0

ऐसा लगता है कि हम एक समान तरीके से काम कर रहे हैं और समान रूप से आलसी हैं! – acl

+1

+1 मुझे यह भी जानना अच्छा लगेगा! मुझे अपने एचपीसी पर रिमोट सिस्टम पर मेरी नोटबुक का मूल्यांकन करना अच्छा लगेगा। –

उत्तर

10

यह विंडोज पर है, Arnouds अच्छा काम का उपयोग कर और सिर्फ सादे पुराने MathLink जोड़ने (सुंदर धीमी btw ...):

link = LinkCreate["8000", LinkProtocol -> "TCPIP"]; 
UsingFrontEnd[ 
NotebookPauseForEvaluation[nb_] := Module[{}, 
While[ NotebookEvaluatingQ[nb], Pause[.25] ] ]; 
NotebookEvaluatingQ[nb_]:=Module[{}, 
SelectionMove[nb,All,Notebook]; 
[email protected]@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]; 
] 
+0

धन्यवाद! क्या हमें वास्तव में 'लिंकप्रोटोकॉल -> "टीसीपीआईपी" की आवश्यकता है या हम अधिक कुशल डिफ़ॉल्ट का उपयोग कर सकते हैं? (मुझे लगता है कि डिफ़ॉल्ट रूप से यह इंटरप्रोसेस कम्युनिकेशन के लिए मेमोरी मैप की गई फ़ाइलों का उपयोग करता है) – Szabolcs

+0

शायद। कम से कम मैं इसे लिंकप्रोटोकॉल के साथ काम नहीं कर सकता -> "साझा स्मृति" –

+0

बीटीडब्लू: आपको वास्तव में इसकी आवश्यकता क्यों है? क्या डंपसेव या कुछ ऐसे द्वारा अपने परिणामों को सहेजना आसान नहीं है? –

11

यह आपके प्रश्न का आंशिक उत्तर है। निम्न कोड एक नोटबुक खोलता है, इसे "टेस्ट" कर्नेल असाइन करता है, उस कर्नेल में नोटबुक का मूल्यांकन करता है, मूल्यांकन समाप्त होने की प्रतीक्षा करता है और मूल्यांकन की गई नोटबुक सहेजता है। यह कारण a स्थानीय कमांड लाइन कर्नेल में परिभाषित करने के लिए करता है।

यह इंतजार कर रहा है कर्नेल मूल्यांकन नोटबुक में समाप्त करने के लिए के लिए:

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

यह जांच करता है कि नोटबुक में किसी भी सेल मूल्यांकन के तहत अब भी है:

NotebookEvaluatingQ[nb_]:=Module[{}, 
SelectionMove[nb,All,Notebook]; 
[email protected]@Map["Evaluating"/.#&,Developer`CellInformation[nb]] 
] 

यह है, जब सिर्फ एक नैदानिक ​​संदेश है आप "टेस्ट" जैसे कर्नेल को फिर से परिभाषित करने की कोशिश कर रहे हैं:

AddTestEvaluator::exists = "Evaluator `1` is already defined, but has a definition that is `2` and not the expected `3`."; 

यह कोड टी है एक "टेस्ट" गिरी के तहत

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

अंत में, इस एक नोटबुक का मूल्यांकन करने के कोड है और मूल्यांकन किया है कर्नेल को बचाने: ओ एक मूल्यांकनकर्ता जोड़ने के लिए, "टेस्ट" की तरह दृश्यपटल को

UsingFrontEnd[  
    AddTestEvaluator["Test"]; 
    nb = NotebookOpen["test.nb"]; 
    SetOptions[nb,Evaluator->"Test"]; 
    SelectionMove[nb,All,Notebook]; 
    SelectionEvaluate[nb]; 
    NotebookPauseForEvaluation[nb]; 
    NotebookSave[nb] 
] 

मैं मैं अभी भी आपकी पूरी समस्या के समाधान के लिए देख रहा हूं (a स्थानीय कमांड लाइन कर्नेल में परिभाषित किया गया है)।

+1

यह पहले से ही बहुत उपयोगी है! क्या आपको पता है कि कर्नेल के बीच एक प्रतीक से जुड़े परिभाषाओं को स्थानांतरित करने के लिए * आसान * तरीका है? यह समानांतर गणनाओं के दौरान होता है, और 'वितरण परिभाषाएं' क्या करती है। तो मुझे लगता है कि यह पहले ही लागू हो चुका है। लेकिन क्या वे कार्य हैं जो इस उपयोगकर्ता को सुलभ करते हैं? – Szabolcs

संबंधित मुद्दे