From: Jörg F. U. <joe...@un...> - 2009-09-21 08:04:58
|
I'd like to write a c++-function that calls a callback function which isonly defined on the python level (at runtime). Attached is an example, how I set the callback function and how they are called. For a simple expression such as a double, I can use PyFloat_AsDouble to convert the Python float to a c-double or Py_BuildValue("(d)") to create the python float. However, if a have a complex class (whose interface has been made available to python via swig), how to a transfer this to python so that it can directly be used as input or output of the callback function? some methods of the CallbackHandlerPython class void CallbackHandlerPython::SetCallbackFunction(PyObject *args) { // check if objective routine is callable if (!PyCallable_Check(args)) { exit(0); } Py_XINCREF(args); Py_XDECREF(mCallback); mCallback = args; } double CallbackHandlerPython::evaluate() { double objective; PyObject *arglist = Py_BuildValue("(d)"); // call external python function PyObject *result = PyEval_CallObject(mCallback,arglist); if (result==0) { printf("CallbackHandlerPython::Objective error calling callback objective.\n"); exit(0); } objective = PyFloat_AsDouble(result); // decrease reference count for result Py_DECREF(result); return objective; } Python file def myCallbackfunction(input): print input return 2.*input PythonCallback = CallbackHandlerPython() PythonCallback.SetCallbackFunctions(myCallbackfunction) print PythonCallback.evaluate(3.) |