Icon

This is the documentation for an older version of Qube. The latest version of the documentation can be found here: Qube

Versions Compared

Key

  • This line was added.
  • This line was removed.
  • Formatting was changed.
Comment: Migrated to Confluence 5.3
Note
titleSupervisor_language_flags

supervisor_language_flags must contain "python" or all python callbacks will be ignored.

 

Sometimes the best way to perform complex behavior in a callback is to put that behavior into an external script which can take the job ID or the job ID and agenda item name (the frame number) as arguments.

The following is an example of a callback that runs for every frame when the job completes.  Admittedly, it may be more efficient to run it once and have the external script iterate over every frame, but this is for demonstration purposes.

The example is also available as an attachment.

Code Block
linenumberstrue
languagepython
#!/bin/env python

import sys,os

sys.path.append('%s/api/python' % os.environ['QBDIR'])
import qb

scriptPathOnSupervisor = '/Users/jburk/test/testCbScript.py'

########################################
# build the job
########################################
job = {
    'prototype': 'cmdrange',
    'name': 'supervisor-side script execution callback test',
    'package': {'cmdline': 'hostname'},
    'agenda': [],
    'callbacks': [ ]
}
########################################
# iterate over the frame range to build the job's agenda and callbacks
########################################
for i in range(5):

    # an agenda item can simply be a frame number
    work = {'name': i}
    job['agenda'].append(work)

    # build a callback for each item in the agenda (each frame)
    cb = {
        'language': 'python',
        'triggers': 'done-job-self', 
        'code': '''
import os,subprocess

jobId = qb.jobid()
workName = %s

script = '%s'
if os.path.exists(script):
    pid =  subprocess.Popen(["python", script, str(jobId), str(workName)]).pid
''' % (i, scriptPathOnSupervisor)
    }

    # append the frame's callback to the job's callback list
    job['callbacks'].append(cb)

########################################
# submit the job
########################################
submitted = qb.submit(job)
for job in submitted:
    print 'submitted %(id)s: %(name)s' % job

...