Here is an example of a script as a local native python task:
There are several ways of doing this. The following are examples.
task python
edit ECF_MICRO '$'
edit ECF_JOB_CMD 'python $ECF_JOB$ > $ECF_JOBOUT$ 2>&1'
label info "none"
meter step -1 100 100
event my_event
Notice that the ECF_JOB_CMD calls python. This allows us change the python version, within the viewer. Alternatively it can be omitted, providing we add "#!/usr/bin/env python" as the first line of our script.
Header: head.py
import os, time, signal import ecflow print "PYTHONPATH=====================================================" print os.environ['PYTHONPATH'].split(os.pathsep) class Client(object): """Encapsulate communication with the ecflow server. This will automatically call the child command init()/complete(), for job start/finish. It will also handle exceptions and signals, by calling the abort child command""" def __init__(self): print "Creating Client" self.ci = ecflow.Client() self.ci.set_host_port("%ECF_NODE%","%ECF_PORT%") self.ci.set_child_pid(os.getpid()) self.ci.set_child_path("%ECF_NAME%") self.ci.set_child_password("%ECF_PASS%") self.ci.set_child_try_no(%ECF_TRYNO%) print "Only wait 20 seconds, if the server cannot be contacted (note default is 24 hours) before failing" self.ci.set_child_timeout(20) # Abort the task for the following signals signal.signal(signal.SIGINT, self.signal_handler) signal.signal(signal.SIGHUP, self.signal_handler) signal.signal(signal.SIGQUIT, self.signal_handler) signal.signal(signal.SIGILL, self.signal_handler) signal.signal(signal.SIGTRAP, self.signal_handler) signal.signal(signal.SIGIOT, self.signal_handler) signal.signal(signal.SIGBUS, self.signal_handler) signal.signal(signal.SIGFPE, self.signal_handler) signal.signal(signal.SIGUSR1, self.signal_handler) signal.signal(signal.SIGUSR2, self.signal_handler) signal.signal(signal.SIGPIPE, self.signal_handler) signal.signal(signal.SIGTERM, self.signal_handler) signal.signal(signal.SIGXCPU, self.signal_handler) signal.signal(signal.SIGPWR, self.signal_handler) def signal_handler(self,signum, frame): print 'Aborting: Signal handler called with signal ', signum self.ci.child_abort("Signal handler called with signal " + str(signum)); def __enter__(self): self.ci.child_init() return self.ci def __exit__(self,ex_type,value,tb): print "Client:__exit__: ex_type:" + str(ex_type) + " value:" + str(value) + "\n" + str(tb) if ex_type != None: self.ci.child_abort("Aborted with exception type " + str(ex_type) + ":" + str(value)) return False self.ci.child_complete() return False |
task wrapper:
$include <head.py> $manual This is the manual section. Instead of calling python from the ECF_JOB_CMD we could alternatively place, #!/bin/env/python on the first line of this file. $end $comment Note: We do not need a tail, $end # This will also handle call to sys.exit(), i.e Client.__exit__ will still be called. with Client() as ci: for i in range(1,100): ci.child_meter('step',i) ci.child_label('info', "value_" + str(i)) time.sleep(1) ci.child_event('my_event') print "Finished event,meter and label child commands" |