Pycall plugin

The Pycall plugin allows calling python scripts from yaml file, that can work either if wanted data was shared or program calls specific event.

Configuration

Simple plugin build:

plugins:
  pycall:           // name of plugin
    on_event:       // run script on event
      testing:      // name of an event
        with:       // data alias
        exec:       // python code which will be executed when the event is called
    on_data:        // run script on data share
      data_name:    // python code which will be executed when data_name is shared

Plugin tree

The root of plugin configuration (named pycall), is a dictionary that contains the following keys:

on_event

This option allows to execute written python code when specific event is called.

data: {a: {type: array, subtype: int, size: 3}}
plugins:
  pycall:
    on_event:
      testing:
        with: { a_python: $a }
        exec: \"print(' * [P] I received    $a =',a_python); a_python[1]=7; print(' * [P] changed it to $a =',a_python);\"

In this example pycall will run script on testing event. In the next step in with section alias name for data is generated. a will be a_python for execusion of the python code. Finally exec contains python code that will be executed on testing event.

There is also an option to set a list of executions:

data: {a: {type: array, subtype: int, size: 3}}
plugins:
  pycall:
    on_event:
      testing:
        - exec: #some_python_script
          with: { a: $a }
        - exec: #some_other_python_script
          with: { b: $a }

on_data

This option allows to execute written python code when specific data is shared.

data: {a: {type: array, subtype: int, size: 3}}
plugins:
  pycall:
    on_data:
      a: print(' * [P] I received    $a =',a); a[1]=7; print(' * [P] changed it to $a =',a);\"

The on_data is a dictionary that contains data name with the python script that will be executed on share.

Examples

Full example of pycall plugin. For siplicity yaml file was included with c code in one file instead of creating separate files.

Yaml file named your_file:

logging: trace
    data: {a: {type: array, subtype: int, size: 3}}
    plugins:
      pycall:
        on_event:
          testing:
            with: { a_python: $a }
            exec: \"print(' * [P] I received    $a =',a_python); a_python[1]=7; print(' * [P] changed it to $a =',a_python);\"

C++ code:

int a[3] = {1, 2, 3};

printf(" * [C] starting with $a = [%d %d %d]\n", a[0], a[1], a[2]);

PDI_share("a", a, PDI_INOUT);
PDI_event("testing");
PDI_reclaim("a");

printf(" * [C] now I see     $a = [%d %d %d]\n", a[0], a[1], a[2]);

Output from the program:

 * [C] starting with $a = [1 2 3]
[PDI][13:51:26] *** trace: Sharing `a' Ref with rights: R = true, W = true
[PDI][13:51:26] *** trace: Calling `a' share. Callbacks to call: 0
[PDI][13:51:26] *** trace: Calling `testing' event. Callbacks to call: 1
 * [P] I received    $a = [1 2 3]
 * [P] changed it to $a = [1 7 3]
 * [C] now I see     $a = [1 7 3]
Last modified January 1, 0001