#include
int main(int argc, char *argv[])
{
PyObject *pName, *pModule;
PyObject *initSVE, *subscribe, *readSV;
PyObject *mySVE;
PyObject *mySV;
PyObject *pArgs, *pValue;
// Initialize Python Interpreter
Py_Initialize();
// Load Python module with SVE client functions
pModule = PyImport_Import("SVaccess");
Py_DECREF(pName);
if (pModule != NULL) {
// Get reference to initSVE (python) function
initSVE = PyObject_GetAttrString(pModule, "initSVE");
// Call initSVE
if (initSVE && PyCallable_Check(initSVE)) {
mySVE = PyObject_CallObject(initSVE, NULL);
}
else {
if (PyErr_Occurred())
PyErr_Print();
fprintf(stderr, "Cannot find function initSVE \n");
}
Py_XDECREF(initSVE);
// Now subscribe to SV (implicitly creates SV on Python side)
subscribe = PyObject_GetAttrString(pModule, "subscribe");
if (subscribe && PyCallable_Check(subscribe)) {
// Pass Arguments as tuple
pArgs = PyTuple_New(2);
PyTuple_SetItem(pArgs, 0, PyString_FromString("ENVIRONMENT"));
PyTuple_SetItem(pArgs, 1, PyString_FromString("RAIN"));
mySV = PyObject_CallObject(subscribe, pArgs);
Py_DECREF(pArgs);
if (mySV != NULL) {
printf("Result of call to subscribe: %ld\n", PyInt_AsLong(mySV));
Py_DECREF(mySV);
}
else {
Py_DECREF(subscribe);
Py_DECREF(pModule);
PyErr_Print();
fprintf(stderr,"Call failed\n");
return 1;
}
}
else {
if (PyErr_Occurred())
PyErr_Print();
fprintf(stderr, "Cannot find function subscribe \n");
}
Py_XDECREF(subscribe);
// Now read value, enter infinite loop
readSV = PyObject_GetAttrString(pModule, "readSV");
if (readSV && PyCallable_Check(readSV)) {
// Again, arguments are passed as tuple
pArgs = PyTuple_New(2);
PyTuple_SetItem(pArgs, 0, PyString_FromString("ENVIRONMENT"));
PyTuple_SetItem(pArgs, 1, PyString_FromString("RAIN"));
while (1)
{
pValue = PyObject_CallObject(readSV, pArgs);
if (pValue != NULL) {
printf("Result of call to readSV: %ld\n", PyInt_AsLong(pValue));
Py_DECREF(pValue);
}
else {
Py_DECREF(readSV);
Py_DECREF(pModule);
PyErr_Print();
fprintf(stderr,"Call failed\n");
return 1;
}
}
}
else {
if (PyErr_Occurred())
PyErr_Print();
fprintf(stderr, "Cannot find function readSV \n");
}
Py_XDECREF(readSV);
Py_DECREF(pModule);
}
else {
PyErr_Print();
fprintf(stderr, "Failed to load \"%s\"\n", argv[1]);
return 1;
}
Py_Finalize();
return 0;
}
Corresponding Python Code (SVaccess.py):
import SVE.PythonClient.SVEclient
from time import sleep
cVariables = {}
mySVE = None
def initSVE():
global mySVE
mySVE = SVE.PythonClient.SVEclient.SVE()
return 0
def subscribe(group, sv):
global mySVE
global cVariables
svStr = group + '.' + sv
cVariables[svStr] = SVE.PythonClient.SVEclient.SharedVariable(group, sv, mySVE)
cVariables[svStr].subscribe()
print "Python: Subscribed to sv ", svStr
return 0
def readSV(group, sv):
global mySVE
global cVariables
svStr = group + '.' + sv
sv_value =cVariables[svStr].read()
sleep(1)
if sv_value == None:
return -1;
else:
return sv_value
if __name__ == '__main__':
initSVE()
subscribe("ENVIRONMENT", "RAIN")
readSV("ENVIRONMENT", "RAIN")
Embedding and Extending Links
http://proquest.safaribooksonline.com/0672328623/ch27lev1sec6#X2ludGVybmFsX1RvYz94bWxpZD0wNjcyMzI4NjIzL3BhcnQwMw==
Compile command (note the python2.4 kludge)
gcc -o SVEclient.exe -I/usr/local/include/python2.5 -Wl,-E -L/usr/lib -lpython2.4 SVEclient.c
pyro-ns, SVE and Environment.py have to be running before calling SVEclient.exe
No comments:
Post a Comment