Versions Compared

Key

  • This line was added.
  • This line was removed.
  • Formatting was changed.


Horizontal Navigation Bar


Button Group

Button Hyperlink
titlePrevious
typestandard
urlhttps://confluence.ecmwf.int

HTML
<div class="section" id="using-python-scripting"> <span id="index-0"></span><span id="id1"></span> <p>As you have already seen, ecFlow has a <a class="reference internal" href="/wiki

/display/ECFLOW/

ecFlow

Dates+

Python+Api#python-api"><em>ecFlow Python Api</em></a>:</p> <div class="highlight-python"><div class="highlight"><pre><span class="c">#!/usr/bin/env python2.7</span> <span class="kn">import</span> <span class="nn">ecflow</span> </pre></div> </div> <div class="line-block"> <div class="line">This allows the <a class="reference internal" href="/wiki/display/ECFLOW/Glossary#term-suite-definition"><em class="xref std std-term">suite definition</em></a> to be built with python.</div> <div class="line">It also allows communication with the <a class="reference internal" href="/wiki/display/ECFLOW/Glossary#term-ecflow-server"><em class="xref std std-term">ecflow_server</em></a>.</div> </div> <div class="line-block"> <div class="line">This is a very powerful feature, that helps to define very complex suites in a relatively compact way.</div> <div class="line">Consider the following <a class="reference internal" href="/wiki/display/ECFLOW/Glossary#term-suite"><em class="xref std std-term">suite</em></a></div> </div> <div class="highlight-python"><pre>suite test family f1 task a task b task c task d task e endfamily family f2 task a task b task c task d task e endfamily family f3 task a task b task c task d task e endfamily family f4 task a task b task c task d task e endfamily family f5 task a task b task c task d task e endfamily family f6 task a task b task c task d task e endfamily endsuite</pre> </div> <p>This can be written in python as:</p> <div class="highlight-python"><div class="highlight"><pre><span class="k">def</span> <span class="nf">create_suite</span><span class="p">(</span><span class="n">name</span><span class="p">)</span> <span class="p">:</span> <span class="n">suite</span> <span class="o">=</span> <span class="n">ecflow</span><span class="o">.</span><span class="n">Suite</span><span class="p">(</span><span class="n">name</span><span class="p">)</span> <span class="k">for</span> <span class="n">i</span> <span class="ow">in</span> <span class="nb">range</span><span class="p">(</span><span class="mi">1</span><span class="p">,</span> <span class="mi">7</span><span class="p">)</span> <span class="p">:</span> <span class="n">fam</span> <span class="o">=</span> <span class="n">suite</span><span class="o">.</span><span class="n">add_family</span><span class="p">(</span><span class="s">&quot;f&quot;</span> <span class="o">+</span> <span class="nb">str</span><span class="p">(</span><span class="n">i</span><span class="p">))</span> <span class="k">for</span> <span class="n">t</span> <span class="ow">in</span> <span class="p">(</span> <span class="s">&quot;a&quot;</span><span class="p">,</span> <span class="s">&quot;b&quot;</span><span class="p">,</span> <span class="s">&quot;c&quot;</span><span class="p">,</span> <span class="s">&quot;d&quot;</span><span class="p">,</span> <span class="s">&quot;e&quot;</span> <span class="p">)</span> <span class="p">:</span> <span class="n">fam</span><span class="o">.</span><span class="n">add_task</span><span class="p">(</span><span class="n">t</span><span class="p">)</span> <span class="k">return</span> <span class="n">suite</span> </pre></div> </div> <div class="line-block"> <div class="line">Python variables can be used to generate <a class="reference internal" href="/wiki/display/ECFLOW/Glossary#term-trigger"><em class="xref std std-term">trigger</em></a> <a class="reference internal" href="/wiki/display/ECFLOW/Glossary#term-dependencies"><em class="xref std std-term">dependencies</em></a>.</div> <div class="line">Imagine that we want to chain the families f1 to f6, so that f2 runs after f1, f3 after f2 and so on.</div> <div class="line">The following will do the trick:</div> </div> <div class="highlight-python"><div class="highlight"><pre><span class="k">def</span> <span class="nf">create_seqeuntial_suite</span><span class="p">(</span><span class="n">name</span><span class="p">)</span> <span class="p">:</span> <span class="n">suite</span> <span class="o">=</span> <span class="n">ecflow</span><span class="o">.</span><span class="n">Suite</span><span class="p">(</span><span class="n">name</span><span class="p">)</span> <span class="k">for</span> <span class="n">i</span> <span class="ow">in</span> <span class="nb">range</span><span class="p">(</span><span class="mi">1</span><span class="p">,</span> <span class="mi">7</span><span class="p">)</span> <span class="p">:</span> <span class="n">fam</span> <span class="o">=</span> <span class="n">suite</span><span class="o">.</span><span class="n">add_family</span><span class="p">(</span><span class="s">&quot;f&quot;</span> <span class="o">+</span> <span class="nb">str</span><span class="p">(</span><span class="n">i</span><span class="p">))</span> <span class="k">if</span> <span class="n">i</span> <span class="o">!=</span> <span class="mi">1</span><span class="p">:</span> <span class="n">fam</span><span class="o">.</span><span class="n">add_trigger</span><span class="p">(</span><span class="s">&quot;f&quot;</span> <span class="o">+</span> <span class="nb">str</span><span class="p">(</span><span class="n">i</span><span class="o">-</span><span class="mi">1</span><span class="p">)</span> <span class="o">+</span> <span class="s">&quot; == complete&quot;</span><span class="p">)</span> <span class="c"># or fam.add_family( &quot;f%d == complete&quot; % (i-1) )</span> <span class="k">for</span> <span class="n">t</span> <span class="ow">in</span> <span class="p">(</span> <span class="s">&quot;a&quot;</span><span class="p">,</span> <span class="s">&quot;b&quot;</span><span class="p">,</span> <span class="s">&quot;c&quot;</span><span class="p">,</span> <span class="s">&quot;d&quot;</span><span class="p">,</span> <span class="s">&quot;e&quot;</span> <span class="p">)</span> <span class="p">:</span> <span class="n">fam</span><span class="o">.</span><span class="n">add_task</span><span class="p">(</span><span class="n">t</span><span class="p">)</span> <span class="k">return</span> <span class="n">suite</span> </pre></div> </div> <div class="line-block"> <div class="line">The following python code shows <strong>examples</strong> of adding the various attributes to a <a class="reference internal" href="/wiki/display/ECFLOW/Glossary#term-node"><em class="xref std std-term">node</em></a> tree.</div> <div class="line">For a detailed explanation please consult the user manual.</div> </div> <div class="highlight-python"><div class="highlight"><pre><span class="c"># provides *examples* of add adding node attributes using the python API</span> <span class="c"># hence does *not* represent a real suite definition</span> <span class="kn">from</span> <span class="nn">ecflow</span> <span class="kn">import</span> <span class="o">*</span> <span class="k">if</span> <span class="n">__name__</span> <span class="o">==</span> <span class="s">&quot;__main__&quot;</span><span class="p">:</span> <span class="c"># adding variables </span> <span class="n">suite</span> <span class="o">=</span> <span class="n">Suite</span><span class="p">(</span><span class="s">&quot;s1&quot;</span><span class="p">);</span> <span class="n">suite</span><span class="o">.</span><span class="n">add_variable</span><span class="p">(</span><span class="n">Variable</span><span class="p">(</span><span class="s">&quot;ECF_HOME&quot;</span><span class="p">,</span> <span class="s">&quot;/tmp/&quot;</span><span class="p">))</span> <span class="n">suite</span><span class="o">.</span><span class="n">add_variable</span><span class="p">(</span><span class="s">&quot;ECF_URL_CMD&quot;</span><span class="p">,</span> <span class="s">&quot;${BROWSER:=firefox} -remote &#39;openURL(</span><span class="si">%E</span><span class="s">CF_URL_BASE%/</span><span class="si">%E</span><span class="s">CF_URL%)&#39;&quot;</span><span class="p">)</span> <span class="n">suite</span><span class="o">.</span><span class="n">add_variable</span><span class="p">(</span><span class="s">&quot;NAME&quot;</span><span class="p">,</span> <span class="mi">10</span><span class="p">)</span> <span class="n">a_dict</span> <span class="o">=</span> <span class="p">{</span> <span class="s">&quot;name&quot;</span><span class="p">:</span><span class="s">&quot;value&quot;</span><span class="p">,</span> <span class="s">&quot;name2&quot;</span><span class="p">:</span><span class="s">&quot;value2&quot;</span><span class="p">,</span> <span class="s">&quot;name3&quot;</span><span class="p">:</span><span class="s">&quot;value3&quot;</span><span class="p">,</span> <span class="s">&quot;name4&quot;</span><span class="p">:</span><span class="s">&quot;value4&quot;</span> <span class="p">}</span> <span class="n">suite</span><span class="o">.</span><span class="n">add_variable</span><span class="p">(</span><span class="n">a_dict</span><span class="p">)</span> <span class="c"># adding limits</span> <span class="n">suite</span><span class="o">.</span><span class="n">add_limit</span><span class="p">(</span> <span class="n">Limit</span><span class="p">(</span><span class="s">&quot;limitName1&quot;</span><span class="p">,</span> <span class="mi">10</span><span class="p">)</span> <span class="p">)</span> <span class="n">suite</span><span class="o">.</span><span class="n">add_limit</span><span class="p">(</span> <span class="s">&quot;limitName3&quot;</span><span class="p">,</span> <span class="mi">10</span> <span class="p">)</span> <span class="c"># adding inlimits</span> <span class="n">suite</span><span class="o">.</span><span class="n">add_inlimit</span><span class="p">(</span> <span class="n">InLimit</span><span class="p">(</span><span class="s">&quot;limitName1&quot;</span><span class="p">,</span> <span class="s">&quot;/s1/f1&quot;</span><span class="p">,</span> <span class="mi">2</span><span class="p">)</span> <span class="p">)</span> <span class="n">suite</span><span class="o">.</span><span class="n">add_inlimit</span><span class="p">(</span> <span class="s">&quot;limitName3&quot;</span><span class="p">,</span> <span class="s">&quot;/s1/f1&quot;</span><span class="p">,</span> <span class="mi">2</span><span class="p">)</span> <span class="c"># add short triggers and complete</span> <span class="n">task</span> <span class="o">=</span> <span class="n">Task</span><span class="p">(</span><span class="s">&quot;task&quot;</span><span class="p">)</span> <span class="n">task</span><span class="o">.</span><span class="n">add_trigger</span><span class="p">(</span> <span class="s">&quot;t2 == active&quot;</span> <span class="p">)</span> <span class="n">task</span><span class="o">.</span><span class="n">add_complete</span><span class="p">(</span> <span class="s">&quot;t2 == complete&quot;</span> <span class="p">)</span> <span class="c"># add long triggers and complete, in example below &#39;True&#39; mean AND and &#39;False&#39; means OR</span> <span class="n">task</span> <span class="o">=</span> <span class="n">Task</span><span class="p">(</span><span class="s">&quot;trigger&quot;</span><span class="p">)</span> <span class="n">task</span><span class="o">.</span><span class="n">add_part_trigger</span><span class="p">(</span> <span class="s">&quot;t1 == complete&quot;</span> <span class="p">)</span> <span class="n">task</span><span class="o">.</span><span class="n">add_part_trigger</span><span class="p">(</span> <span class="s">&quot;t2 == active&quot;</span><span class="p">,</span> <span class="bp">True</span> <span class="p">)</span> <span class="c"># for long and/or expressions, subsequent expr must be and/or</span> <span class="n">task</span><span class="o">.</span><span class="n">add_part_complete</span><span class="p">(</span> <span class="s">&quot;t3 == complete&quot;</span> <span class="p">)</span> <span class="n">task</span><span class="o">.</span><span class="n">add_part_complete</span><span class="p">(</span> <span class="s">&quot;t4 == active&quot;</span><span class="p">,</span> <span class="bp">False</span><span class="p">)</span> <span class="c"># for long and/or expressions, subsequent expr must be and/or</span> <span class="c"># add events</span> <span class="n">task</span><span class="o">.</span><span class="n">add_event</span><span class="p">(</span> <span class="n">Event</span><span class="p">(</span><span class="mi">1</span><span class="p">)</span> <span class="p">)</span> <span class="n">task</span><span class="o">.</span><span class="n">add_event</span><span class="p">(</span> <span class="mi">2</span> <span class="p">)</span> <span class="n">task</span><span class="o">.</span><span class="n">add_event</span><span class="p">(</span> <span class="n">Event</span><span class="p">(</span><span class="mi">10</span><span class="p">,</span> <span class="s">&quot;Eventname&quot;</span><span class="p">)</span> <span class="p">)</span> <span class="n">task</span><span class="o">.</span><span class="n">add_event</span><span class="p">(</span> <span class="mi">10</span><span class="p">,</span> <span class="s">&quot;Eventname2&quot;</span> <span class="p">)</span> <span class="n">task</span><span class="o">.</span><span class="n">add_event</span><span class="p">(</span> <span class="s">&quot;fred&quot;</span> <span class="p">)</span> <span class="c"># add meter</span> <span class="n">task</span><span class="o">.</span><span class="n">add_meter</span><span class="p">(</span> <span class="n">Meter</span><span class="p">(</span><span class="s">&quot;metername1&quot;</span><span class="p">,</span> <span class="mi">0</span><span class="p">,</span> <span class="mi">100</span><span class="p">,</span> <span class="mi">50</span><span class="p">)</span> <span class="p">)</span> <span class="n">task</span><span class="o">.</span><span class="n">add_meter</span><span class="p">(</span> <span class="s">&quot;metername3&quot;</span><span class="p">,</span> <span class="mi">0</span><span class="p">,</span> <span class="mi">100</span> <span class="p">)</span> <span class="c"># add label</span> <span class="n">task</span><span class="o">.</span><span class="n">add_label</span><span class="p">(</span> <span class="n">Label</span><span class="p">(</span><span class="s">&quot;label_name1&quot;</span><span class="p">,</span> <span class="s">&quot;value&quot;</span><span class="p">)</span> <span class="p">)</span> <span class="n">task</span><span class="o">.</span><span class="n">add_label</span><span class="p">(</span> <span class="s">&quot;label_name3&quot;</span><span class="p">,</span> <span class="s">&quot;value&quot;</span> <span class="p">)</span> <span class="c"># add Repeat. A node can only have one repeat, hence we delete the repeat before, adding another</span> <span class="n">task</span><span class="o">.</span><span class="n">add_repeat</span><span class="p">(</span> <span class="n">RepeatInteger</span><span class="p">(</span><span class="s">&quot;integer&quot;</span><span class="p">,</span> <span class="mi">0</span><span class="p">,</span> <span class="mi">100</span><span class="p">,</span> <span class="mi">2</span><span class="p">)</span> <span class="p">)</span> <span class="n">task</span><span class="o">.</span><span class="n">delete_repeat</span><span class="p">()</span> <span class="n">task</span><span class="o">.</span><span class="n">add_repeat</span><span class="p">(</span> <span class="n">RepeatEnumerated</span><span class="p">(</span><span class="s">&quot;enum&quot;</span><span class="p">,</span> <span class="p">[</span><span class="s">&quot;red&quot;</span><span class="p">,</span> <span class="s">&quot;green&quot;</span><span class="p">,</span> <span class="s">&quot;blue&quot;</span> <span class="p">]</span> <span class="p">)</span> <span class="p">)</span> <span class="n">task</span><span class="o">.</span><span class="n">delete_repeat</span><span class="p">()</span> <span class="n">task</span><span class="o">.</span><span class="n">add_repeat</span><span class="p">(</span> <span class="n">RepeatDate</span><span class="p">(</span><span class="s">&quot;date&quot;</span><span class="p">,</span> <span class="mi">20100111</span><span class="p">,</span> <span class="mi">20100115</span><span class="p">,</span> <span class="mi">2</span><span class="p">)</span> <span class="p">)</span> <span class="n">task</span><span class="o">.</span><span class="n">delete_repeat</span><span class="p">()</span> <span class="n">task</span><span class="o">.</span><span class="n">add_repeat</span><span class="p">(</span> <span class="n">RepeatString</span><span class="p">(</span><span class="s">&quot;string&quot;</span><span class="p">,</span> <span class="p">[</span><span class="s">&quot;a&quot;</span><span class="p">,</span> <span class="s">&quot;b&quot;</span><span class="p">,</span> <span class="s">&quot;c&quot;</span> <span class="p">]</span> <span class="p">)</span> <span class="p">)</span> <span class="n">task</span><span class="o">.</span><span class="n">delete_repeat</span><span class="p">()</span> <span class="c"># create a time series, used for adding time and today and cron</span> <span class="n">start</span> <span class="o">=</span> <span class="n">TimeSlot</span><span class="p">(</span><span class="mi">0</span><span class="p">,</span> <span class="mi">0</span><span class="p">)</span> <span class="n">finish</span> <span class="o">=</span> <span class="n">TimeSlot</span><span class="p">(</span><span class="mi">23</span><span class="p">,</span> <span class="mi">0</span><span class="p">)</span> <span class="n">incr</span> <span class="o">=</span> <span class="n">TimeSlot</span><span class="p">(</span><span class="mi">0</span><span class="p">,</span> <span class="mi">30</span><span class="p">)</span> <span class="n">time_series</span> <span class="o">=</span> <span class="n">TimeSeries</span><span class="p">(</span> <span class="n">start</span><span class="p">,</span> <span class="n">finish</span><span class="p">,</span> <span class="n">incr</span><span class="p">,</span> <span class="bp">True</span><span class="p">)</span> <span class="c"># True means relative to suite start</span> <span class="c"># add a today</span> <span class="n">task</span><span class="o">.</span><span class="n">add_today</span><span class="p">(</span> <span class="s">&quot;00:30&quot;</span> <span class="p">)</span> <span class="n">task</span><span class="o">.</span><span class="n">add_today</span><span class="p">(</span> <span class="s">&quot;+00:30&quot;</span> <span class="p">)</span> <span class="n">task</span><span class="o">.</span><span class="n">add_today</span><span class="p">(</span> <span class="s">&quot;+00:30 20:00 01:00&quot;</span> <span class="p">)</span> <span class="n">task</span><span class="o">.</span><span class="n">add_today</span><span class="p">(</span> <span class="n">Today</span><span class="p">(</span> <span class="n">time_series</span><span class="p">)</span> <span class="p">)</span> <span class="n">task</span><span class="o">.</span><span class="n">add_today</span><span class="p">(</span> <span class="n">Today</span><span class="p">(</span> <span class="mi">0</span><span class="p">,</span> <span class="mi">10</span> <span class="p">))</span> <span class="n">task</span><span class="o">.</span><span class="n">add_today</span><span class="p">(</span> <span class="mi">0</span><span class="p">,</span> <span class="mi">59</span><span class="p">,</span> <span class="bp">True</span> <span class="p">)</span> <span class="n">task</span><span class="o">.</span><span class="n">add_today</span><span class="p">(</span> <span class="n">Today</span><span class="p">(</span><span class="n">TimeSlot</span><span class="p">(</span><span class="mi">20</span><span class="p">,</span> <span class="mi">10</span><span class="p">))</span> <span class="p">)</span> <span class="n">task</span><span class="o">.</span><span class="n">add_today</span><span class="p">(</span> <span class="n">Today</span><span class="p">(</span><span class="n">TimeSlot</span><span class="p">(</span><span class="mi">20</span><span class="p">,</span> <span class="mi">20</span><span class="p">),</span> <span class="bp">False</span><span class="p">))</span> <span class="c"># add time</span> <span class="n">task</span><span class="o">.</span><span class="n">add_time</span><span class="p">(</span> <span class="s">&quot;00:30&quot;</span> <span class="p">)</span> <span class="n">task</span><span class="o">.</span><span class="n">add_time</span><span class="p">(</span> <span class="s">&quot;+00:30&quot;</span> <span class="p">)</span> <span class="n">task</span><span class="o">.</span><span class="n">add_time</span><span class="p">(</span> <span class="s">&quot;+00:30 20:00 01:00&quot;</span> <span class="p">)</span> <span class="n">task</span><span class="o">.</span><span class="n">add_time</span><span class="p">(</span> <span class="n">Time</span><span class="p">(</span><span class="n">time_series</span> <span class="p">))</span> <span class="n">task</span><span class="o">.</span><span class="n">add_time</span><span class="p">(</span> <span class="n">Time</span><span class="p">(</span> <span class="mi">0</span><span class="p">,</span> <span class="mi">10</span> <span class="p">))</span> <span class="n">task</span><span class="o">.</span><span class="n">add_time</span><span class="p">(</span> <span class="mi">0</span><span class="p">,</span> <span class="mi">59</span><span class="p">,</span> <span class="bp">True</span><span class="p">)</span> <span class="n">task</span><span class="o">.</span><span class="n">add_time</span><span class="p">(</span> <span class="n">Time</span><span class="p">(</span><span class="n">TimeSlot</span><span class="p">(</span><span class="mi">20</span><span class="p">,</span> <span class="mi">10</span><span class="p">))</span> <span class="p">)</span> <span class="n">task</span><span class="o">.</span><span class="n">add_time</span><span class="p">(</span> <span class="n">Time</span><span class="p">(</span><span class="n">TimeSlot</span><span class="p">(</span><span class="mi">20</span><span class="p">,</span> <span class="mi">20</span><span class="p">),</span> <span class="bp">False</span><span class="p">))</span> <span class="c"># add date</span> <span class="k">for</span> <span class="n">i</span> <span class="ow">in</span> <span class="p">[</span> <span class="mi">1</span><span class="p">,</span> <span class="mi">2</span><span class="p">,</span> <span class="mi">4</span><span class="p">,</span> <span class="mi">8</span><span class="p">,</span> <span class="mi">16</span> <span class="p">]</span> <span class="p">:</span> <span class="n">task</span><span class="o">.</span><span class="n">add_date</span><span class="p">(</span> <span class="n">i</span><span class="p">,</span> <span class="mi">0</span><span class="p">,</span> <span class="mi">0</span><span class="p">)</span> <span class="c"># day,month,year, where corresponding 0 means any possible day,month, year</span> <span class="n">task</span><span class="o">.</span><span class="n">add_date</span><span class="p">(</span> <span class="n">Date</span><span class="p">(</span><span class="mi">1</span><span class="p">,</span> <span class="mi">1</span><span class="p">,</span> <span class="mi">2010</span><span class="p">))</span> <span class="c"># add day</span> <span class="n">task</span><span class="o">.</span><span class="n">add_day</span><span class="p">(</span> <span class="n">Day</span><span class="p">(</span><span class="n">Days</span><span class="o">.</span><span class="n">sunday</span><span class="p">))</span> <span class="n">task</span><span class="o">.</span><span class="n">add_day</span><span class="p">(</span> <span class="n">Days</span><span class="o">.</span><span class="n">monday</span><span class="p">)</span> <span class="n">task</span><span class="o">.</span><span class="n">add_day</span><span class="p">(</span> <span class="s">&quot;tuesday&quot;</span><span class="p">)</span> <span class="c"># create cron, showing different ways adding the time, to a cron attribute</span> <span class="n">cron</span> <span class="o">=</span> <span class="n">Cron</span><span class="p">()</span> <span class="n">cron</span><span class="o">.</span><span class="n">set_week_days</span><span class="p">(</span> <span class="p">[</span><span class="mi">0</span><span class="p">,</span> <span class="mi">1</span><span class="p">,</span> <span class="mi">2</span><span class="p">,</span> <span class="mi">3</span><span class="p">,</span> <span class="mi">4</span><span class="p">,</span> <span class="mi">5</span><span class="p">,</span> <span class="mi">6</span><span class="p">]</span> <span class="p">)</span> <span class="n">cron</span><span class="o">.</span><span class="n">set_days_of_month</span><span class="p">(</span> <span class="p">[</span><span class="mi">1</span><span class="p">,</span> <span class="mi">2</span><span class="p">,</span> <span class="mi">3</span><span class="p">,</span> <span class="mi">4</span><span class="p">,</span> <span class="mi">5</span><span class="p">,</span> <span class="mi">6</span><span class="p">]</span> <span class="p">)</span> <span class="n">cron</span><span class="o">.</span><span class="n">set_months</span><span class="p">(</span> <span class="p">[</span><span class="mi">1</span><span class="p">,</span> <span class="mi">2</span><span class="p">,</span> <span class="mi">3</span><span class="p">,</span> <span class="mi">4</span><span class="p">,</span> <span class="mi">5</span><span class="p">,</span> <span class="mi">6</span><span class="p">]</span> <span class="p">)</span> <span class="n">start</span> <span class="o">=</span> <span class="n">TimeSlot</span><span class="p">(</span><span class="mi">0</span><span class="p">,</span> <span class="mi">0</span><span class="p">)</span> <span class="n">finish</span> <span class="o">=</span> <span class="n">TimeSlot</span><span class="p">(</span><span class="mi">23</span><span class="p">,</span> <span class="mi">0</span><span class="p">)</span> <span class="n">incr</span> <span class="o">=</span> <span class="n">TimeSlot</span><span class="p">(</span><span class="mi">0</span><span class="p">,</span> <span class="mi">30</span><span class="p">)</span> <span class="n">ts</span> <span class="o">=</span> <span class="n">TimeSeries</span><span class="p">(</span> <span class="n">start</span><span class="p">,</span> <span class="n">finish</span><span class="p">,</span> <span class="n">incr</span><span class="p">,</span> <span class="bp">True</span><span class="p">)</span> <span class="c"># True means relative to suite start</span> <span class="n">cron</span><span class="o">.</span><span class="n">set_time_series</span><span class="p">(</span> <span class="n">ts</span> <span class="p">)</span> <span class="n">cron1</span> <span class="o">=</span> <span class="n">Cron</span><span class="p">()</span> <span class="n">cron1</span><span class="o">.</span><span class="n">set_week_days</span><span class="p">(</span> <span class="p">[</span><span class="mi">0</span><span class="p">,</span> <span class="mi">1</span><span class="p">,</span> <span class="mi">2</span><span class="p">,</span> <span class="mi">3</span><span class="p">,</span> <span class="mi">4</span><span class="p">,</span> <span class="mi">5</span><span class="p">,</span> <span class="mi">6</span><span class="p">]</span> <span class="p">)</span> <span class="n">cron1</span><span class="o">.</span><span class="n">set_time_series</span><span class="p">(</span> <span class="mi">1</span><span class="p">,</span> <span class="mi">30</span><span class="p">,</span> <span class="bp">True</span> <span class="p">)</span> <span class="n">cron2</span> <span class="o">=</span> <span class="n">Cron</span><span class="p">()</span> <span class="n">cron2</span><span class="o">.</span><span class="n">set_week_days</span><span class="p">(</span> <span class="p">[</span><span class="mi">0</span><span class="p">,</span> <span class="mi">1</span><span class="p">,</span> <span class="mi">2</span><span class="p">,</span> <span class="mi">3</span><span class="p">,</span> <span class="mi">4</span><span class="p">,</span> <span class="mi">5</span><span class="p">,</span> <span class="mi">6</span><span class="p">]</span> <span class="p">)</span> <span class="n">cron2</span><span class="o">.</span><span class="n">set_time_series</span><span class="p">(</span> <span class="s">&quot;00:30 01:30 00:01&quot;</span> <span class="p">)</span> <span class="n">cron3</span> <span class="o">=</span> <span class="n">Cron</span><span class="p">()</span> <span class="n">cron3</span><span class="o">.</span><span class="n">set_week_days</span><span class="p">(</span> <span class="p">[</span><span class="mi">0</span><span class="p">,</span> <span class="mi">1</span><span class="p">,</span> <span class="mi">2</span><span class="p">,</span> <span class="mi">3</span><span class="p">,</span> <span class="mi">4</span><span class="p">,</span> <span class="mi">5</span><span class="p">,</span> <span class="mi">6</span><span class="p">]</span> <span class="p">)</span> <span class="n">cron3</span><span class="o">.</span><span class="n">set_time_series</span><span class="p">(</span> <span class="s">&quot;+00:30&quot;</span> <span class="p">)</span> <span class="c"># add auto cancel</span> <span class="n">t1</span> <span class="o">=</span> <span class="n">Task</span><span class="p">(</span><span class="s">&quot;t1&quot;</span><span class="p">);</span> <span class="n">t3</span> <span class="o">=</span> <span class="n">Task</span><span class="p">(</span><span class="s">&quot;t3&quot;</span><span class="p">)</span> <span class="n">t4</span> <span class="o">=</span> <span class="n">Task</span><span class="p">(</span><span class="s">&quot;t4&quot;</span><span class="p">)</span> <span class="n">t5</span> <span class="o">=</span> <span class="n">Task</span><span class="p">(</span><span class="s">&quot;t5&quot;</span><span class="p">)</span> <span class="n">t1</span><span class="o">.</span><span class="n">add_autocancel</span><span class="p">(</span> <span class="mi">3</span> <span class="p">)</span> <span class="c"># 3 days</span> <span class="n">t3</span><span class="o">.</span><span class="n">add_autocancel</span><span class="p">(</span> <span class="mi">20</span><span class="p">,</span> <span class="mi">10</span><span class="p">,</span> <span class="bp">True</span> <span class="p">)</span>

and+Clocks
Button Hyperlink
titleUp
typestandard
urlhttps://confluence.ecmwf.int/display/ECFLOW/Advanced+Topics
Button Hyperlink
titleNext
typestandard
urlhttps://confluence.ecmwf.int/display/ECFLOW/Indentation


As you have already seen, ecFlow has a ecFlow Python Api: (for both python2 and python3)

import ecflow 
This allows the suite definition to be built with python.
It also allows communication with the ecflow_server.
This is a very powerful feature, that helps to define very complex suites in a relatively compact way.
Consider the following suite:


Code Block
suite test
 family f1
     task a
     task b
     task c
     task d
     task e
 endfamily
 family f2
     task a
     task b
     task c
     task d
     task e
 endfamily
 family f3
     task a
     task b
     task c
     task d
     task e
 endfamily
 family f4
     task a
     task b
     task c
     task d
     task e
 endfamily
 family f5
     task a
     task b
     task c
     task d
     task e
 endfamily
 family f6
     task a
     task b
     task c
     task d
     task e
 endfamily
endsuite

This can be written in python as:


Code Block
languagepy
def create_suite(name) : 
    suite = Suite(name)
    for i in range(1, 7) :
        fam = suite.add_family("f" + str(i))
        for t in ( "a", "b", "c", "d", "e" ) :
           

...

 fam.add_task(t)
    return suite



Code Block
languagepy
 def create_suite(name) : 
     return Suite(name,
             [ Family("f{0}".format(i),
                 [ Task(t) for t in ( "a", "b", "c", "d", "e") ]) 
               for i in range(1,7) ])


Python variables can be used to generate trigger dependencies.
Imagine that we want to chain the families f1 to f6, so that f2 runs after f1, f3 after f2 and so on.
The following will do the trick:


Code Block
def create_sequential_suite(name) :
    suite = Suite(name)
    for i in range(1, 7) :
        fam = suite.add_family("f" + str(i))
        if i != 1: 
            fam += Trigger("f" + str(i-1) + " == complete")  # or fam.add_family( "f%d == complete" % (i-1) )
        for t in ( "a", "b", "c", "d", "e" ) :
            fam.add_task(t) 
    return suite

For more detailed example please see the user manual

Adding Node attributes

There are several styles for adding node attributes(Repeat,Time,Today,Date,Day,Cron,Clock,DefStatus,Meter,Event,Variable,Label,Trigger, Complete, Limit,Inlimit,Zombie,Late)

Code Block
languagepy
# Functional style
node.add_variable(home,'COURSE')          # c++ style
node.add_limit('limitX',10)               # c++ style

# Using <node>.add(<attributes>) 
node.add(Edit(home=COURSE),               # Notice that add() allows you adjust the indentation
         Limit('limitX',10))              # node.add(<attributes>)  

# in place. When creating a Node, attributes are additional arguments (preferred)
# This also allows indentation.
#   Task(name,<attributes>)
#   Family(name,Node | <attributes>)
#   Suite(name,Node  | <attributes>)
node = Family('t1',                               
           Edit(home='COURSE'),                   
           Limit('limitX',10),
           Task('t1',
              Event('e')))

# Using <node> += <attribute>     adding a single attribute                        
node += Edit(home='COURSE')                            

# Using <node> += [ <attributes> ]  - use list to add multiple attributes
node += [ Edit(home='COURSE'), Limit('limitY',10), Event(1) ]     

# Using node + <attributes>  - A node container(suite | family) must appear on the left hand side. Use brackets to control scope.
node + Edit(home=COURSE) + Limit('limitZ',10)   

# In this example, variable 'name' is added to suite 's/' and not task 't3'     
suite = Suite("s") + Family("f") + Family("f2") + Task("t3") + Edit(name="value")

suite s
  edit name 'value'
  family f
  endfamily
  family f2
  endfamily
  task t3
endsuite


# here we use parenthesis to control where the variable gets added
suite = Suite("s") + Family("f") + Family("f2") + (Task("t3") + Edit(name="value"))

 suite s
  family f
  endfamily
  family f2
  endfamily
  task t3
    edit name 'value'
endsuite



Horizontal Navigation Bar


Button Group

Button Hyperlink
titlePrevious
typestandard
urlhttps://confluence.ecmwf.int/display/ECFLOW/Dates+and+Clocks
Button Hyperlink
titleUp
typestandard
urlhttps://confluence.ecmwf.int/display/ECFLOW/Advanced+Topics
Button Hyperlink
titleNext
typestandard
urlhttps://confluence.ecmwf.int/display/ECFLOW/Indentation

<span class="n">t4</span><span class="o">.</span><span class="n">add_autocancel</span><span class="p">(</span> <span class="n">TimeSlot</span><span class="p">(</span><span class="mi">10</span><span class="p">,</span> <span class="mi">10</span><span class="p">),</span> <span class="bp">True</span> <span class="p">)</span> <span class="c"># hour,minutes,relative</span> <span class="n">t5</span><span class="o">.</span><span class="n">add_autocancel</span><span class="p">(</span> <span class="n">Autocancel</span><span class="p">(</span><span class="mi">1</span><span class="p">,</span> <span class="mi">10</span><span class="p">,</span> <span class="bp">True</span><span class="p">)</span> <span class="p">)</span> <span class="c"># hour,minutes,relative</span> <span class="c"># add late</span> <span class="n">late</span> <span class="o">=</span> <span class="n">Late</span><span class="p">()</span> <span class="n">late</span><span class="o">.</span><span class="n">submitted</span><span class="p">(</span> <span class="n">TimeSlot</span><span class="p">(</span><span class="mi">20</span><span class="p">,</span> <span class="mi">10</span><span class="p">))</span> <span class="n">late</span><span class="o">.</span><span class="n">active</span><span class="p">(</span> <span class="n">TimeSlot</span><span class="p">(</span><span class="mi">20</span><span class="p">,</span> <span class="mi">10</span><span class="p">))</span> <span class="n">late</span><span class="o">.</span><span class="n">complete</span><span class="p">(</span> <span class="n">TimeSlot</span><span class="p">(</span><span class="mi">20</span><span class="p">,</span> <span class="mi">10</span><span class="p">),</span> <span class="bp">True</span><span class="p">)</span> <span class="n">task</span><span class="o">.</span><span class="n">add_late</span><span class="p">(</span> <span class="n">late</span> <span class="p">)</span> <span class="n">late</span> <span class="o">=</span> <span class="n">Late</span><span class="p">()</span> <span class="n">late</span><span class="o">.</span><span class="n">submitted</span><span class="p">(</span> <span class="mi">20</span><span class="p">,</span> <span class="mi">10</span> <span class="p">)</span> <span class="n">late</span><span class="o">.</span><span class="n">active</span><span class="p">(</span> <span class="mi">20</span><span class="p">,</span> <span class="mi">10</span> <span class="p">)</span> <span class="n">late</span><span class="o">.</span><span class="n">complete</span><span class="p">(</span> <span class="mi">20</span><span class="p">,</span> <span class="mi">10</span><span class="p">,</span> <span class="bp">True</span><span class="p">)</span> <span class="n">t1</span><span class="o">.</span><span class="n">add_late</span><span class="p">(</span> <span class="n">late</span> <span class="p">)</span> <span class="c"># add defstatus, last one set takes effect</span> <span class="n">task</span><span class="o">.</span><span class="n">add_defstatus</span><span class="p">(</span> <span class="n">DState</span><span class="o">.</span><span class="n">complete</span> <span class="p">)</span> <span class="n">task</span><span class="o">.</span><span class="n">add_defstatus</span><span class="p">(</span> <span class="n">DState</span><span class="o">.</span><span class="n">queued</span> <span class="p">)</span> <span class="n">task</span><span class="o">.</span><span class="n">add_defstatus</span><span class="p">(</span> <span class="n">DState</span><span class="o">.</span><span class="n">aborted</span> <span class="p">)</span> <span class="n">task</span><span class="o">.</span><span class="n">add_defstatus</span><span class="p">(</span> <span class="n">DState</span><span class="o">.</span><span class="n">submitted</span> <span class="p">)</span> <span class="n">task</span><span class="o">.</span><span class="n">add_defstatus</span><span class="p">(</span> <span class="n">DState</span><span class="o">.</span><span class="n">suspended</span> <span class="p">)</span> <span class="n">task</span><span class="o">.</span><span class="n">add_defstatus</span><span class="p">(</span> <span class="n">DState</span><span class="o">.</span><span class="n">active</span> <span class="p">)</span> <span class="c"># add clock</span> <span class="n">clock</span> <span class="o">=</span> <span class="n">Clock</span><span class="p">(</span><span class="mi">1</span><span class="p">,</span> <span class="mi">1</span><span class="p">,</span> <span class="mi">2010</span><span class="p">,</span> <span class="bp">False</span><span class="p">)</span> <span class="c"># day,month, year, hybrid(true), real(False)</span> <span class="n">clock</span><span class="o">.</span><span class="n">set_gain</span><span class="p">(</span><span class="mi">1</span><span class="p">,</span> <span class="mi">10</span><span class="p">,</span> <span class="bp">True</span><span class="p">)</span> <span class="c"># True means positive gain</span> <span class="n">suite</span> <span class="o">=</span> <span class="n">Suite</span><span class="p">(</span><span class="s">&quot;suite&quot;</span><span class="p">)</span> <span class="n">suite</span><span class="o">.</span><span class="n">add_clock</span><span class="p">(</span><span class="n">clock</span><span class="p">)</span> <span class="n">clock</span> <span class="o">=</span> <span class="n">Clock</span><span class="p">(</span><span class="bp">False</span><span class="p">)</span> <span class="c"># Use the current time and date with real time clock</span> <span class="n">clock</span><span class="o">.</span><span class="n">set_gain_in_seconds</span><span class="p">(</span><span class="mi">12</span><span class="p">,</span> <span class="bp">True</span><span class="p">)</span> <span class="n">s1</span> <span class="o">=</span> <span class="n">Suite</span><span class="p">(</span><span class="s">&quot;s1&quot;</span><span class="p">)</span> <span class="n">s1</span><span class="o">.</span><span class="n">add_clock</span><span class="p">(</span><span class="n">clock</span><span class="p">)</span> </pre></div> </div> </div>