Velocity Reviews - Computer Hardware Reviews

Velocity Reviews > Newsgroups > Programming > Python > Let python call a C function pointer passed from the C Python API

Reply
Thread Tools

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

 
 
hvictor
Guest
Posts: n/a
 
      11-16-2009
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


 
Reply With Quote
 
 
 
 
Carl Banks
Guest
Posts: n/a
 
      11-16-2009
On Nov 16, 5:04*am, hvictor <(E-Mail Removed)> wrote:
> 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,&i val,&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
 
Reply With Quote
 
 
 
 
sturlamolden
Guest
Posts: n/a
 
      11-16-2009
On 16 Nov, 14:25, Carl Banks <(E-Mail Removed)> wrote:

> Python can't call C function pointers. *


Yes it can, use ctypes...





 
Reply With Quote
 
 
 
Reply

Thread Tools

Posting Rules
You may not post new threads
You may not post replies
You may not post attachments
You may not edit your posts

BB code is On
Smilies are On
[IMG] code is On
HTML code is Off
Trackbacks are On
Pingbacks are On
Refbacks are Off


Similar Threads
Thread Thread Starter Forum Replies Last Post
OT: Let me in! Let me in! quasi/various/bob [7.13.86.42] MCSE 7 05-30-2006 10:00 PM
write a function such that when ever i call this function in some other function .it should give me tha data type and value of calling function parameter komal C++ 6 01-25-2005 11:13 AM
Have a nice day! ...//more of your parables. Pray let us know whoyou are, let us Ravens U. Locksmith Python 1 05-26-2004 11:00 AM
winxp IE will not let you exit, and my comptuer / other folders will not let you open them. Daniel NZ Computing 2 05-11-2004 02:02 AM
Let or not let the text float Luigi Donatello Asero HTML 6 01-15-2004 04:08 PM



Advertisments