[C++-sig] Boost Python and ctypes
Joseph Lisee
jlisee at gmail.com
Tue Feb 26 20:34:24 CET 2008
I don't know how to integrate this into Boost.Python in a clean way, but here
is a litter terminal example that can help:
>>> array = (ctypes.c_int * 3)(1,2,3)
>>> addr = ctypes.addressof(array)
>>> arrayPtr = ctypes.cast(addr, ctypes.POINTER((ctypes.c_int)))
>>> array[0]
1
>>> arrayPtr[0]
1
So basically if you can get a long value into python representing the address
of your float array you are good to go. This is done in Python-Ogre by just
wrapping a manual cast function:
unsigned long castToAddress(float* ptr)
{
return (unsigned long)ptr;
}
A more permanent way to do this would be to change your wrapper to execute
this code with Boost.Python's C++ python API interface (not tested):
bp::object convertFloat(float* ptr)
{
bp::object ctypes = bp::import("ctypes");
bp::long addr((unsigned addr)ptr);
bp::object pointerType(ctypes["POINTER"](ctypes["c_float"]));
return ctypes["cast"](addr, pointerType);
}
I believe you can do this by specifying a manual to python convert for the
"float*" type.
Hope that helps,
Joseph Lisee
More information about the Cplusplus-sig
mailing list