Let python call a C function pointer passed from the C Python API

H

hvictor

I have C++ a void function pointer stored in a variable call. The
pointed function takes an int and a char* as arguments.

I have a python module containing this function:

def yeah(x):
x(int(0),"text argument")
return "pointer called"

As you can see I'm trying to use the argument x of the function like a
method object.
In the C++ side I'm doing following (note that I only paste relevant
parts of code because this system is working fine, C++ is able to call
function yeah and get its return value, but only with a string-
oriented test):
....
PyObject *pValue; // the argument for python

pValue = PyCObject_FromVoidPtr(call,destr); // destr is a void fctn
ptr, required from the api.

PyObject *pFunc = PyObject_GetAttrString(pModule, "yeah");

....
PyTuple_SetItem(pArgs, 0, pValue); // pArgs is a pyobject, the
arguments, I insert pValue in it.

pValue = PyObject_CallObject(pFunc, pArgs);

....

It does not work. can anyone help me please? I just want python to
call this function pointer.

Thank you
 
C

Carl Banks

I have C++ a void function pointer stored in a variable call. The
pointed function takes an int and a char* as arguments.

I have a python module containing this function:

def yeah(x):
        x(int(0),"text argument")
        return "pointer called"

As you can see I'm trying to use the argument x of the function like a
method object.
In the C++ side I'm doing following (note that I only paste relevant
parts of code because this system is working fine, C++ is able to call
function yeah and get its return value, but only with a string-
oriented test):
...
PyObject *pValue; // the argument for python

pValue = PyCObject_FromVoidPtr(call,destr); // destr is a void fctn
ptr, required from the api.

PyObject *pFunc = PyObject_GetAttrString(pModule, "yeah");

...
PyTuple_SetItem(pArgs, 0, pValue); // pArgs is a pyobject, the
arguments, I insert pValue in it.

pValue = PyObject_CallObject(pFunc, pArgs);

...

It does not work. can anyone help me please? I just want python to
call this function pointer.

Python can't call C function pointers. You have to write a function
in C that accepts a CObject and some arguments, unpacks the arguments,
retrieves the function pointer from the CObject, and calls it. Quick
and dirty function that might do that (untested, not robust).


static PyObject* call_user_void_ptr(PyObject* self, PyObject* args) {
PyObject* cobj;
int ival;
char* sval;
void (*func)(int,char*);
if (!PyArg_ParseTuple("O!is",&PyCObject_Type,&cobj,&ival,&sval))
return 0;
func = PyCObject_AsVoidPtr(cobj);
func(ival,sval);
Py_RETURN_NONE;
}


def yeah(x):
call_user_void_ptr(x,int(i),"text_argument")
print "pointer called"


In a pinch, you could call the function pointer from ctypes. Since
you're already writing a C extension I wouldn't recommend it as a
final solution, though.


Carl Banks
 

Ask a Question

Want to reply to this thread or ask your own question?

You'll need to choose a username for the site, which only take a couple of moments. After that, you can post your question and our members will help you out.

Ask a Question

Members online

No members online now.

Forum statistics

Threads
473,754
Messages
2,569,527
Members
44,998
Latest member
MarissaEub

Latest Threads

Top