Re: [ctypes-users] Accessing C part of PyObjects?
Brought to you by:
theller
From: Thomas H. <th...@ct...> - 2006-11-17 19:41:15
|
Lenard Lindstrom schrieb: > On 16 Nov 2006 at 20:01, Thomas Heller wrote: > >> Tim Ansell schrieb: >> > Hello, >> > >> > I'm currently trying to access the C parts of some python objects. (Such >> > as the SDL Surface of a Pygame Surface.) >> >> I also want this because it would allow to define a byref_at(cobj, offset) function >> that would behave like byref(cobj) but would accept an additional offset argument; >> the request for something like this has been made several times on this list. >> This could be accomplished by calling byref() and then changing the pointer >> contained in the created object. >> >> Since Python2.5 is now out is it not possible to change ctypes for that, >> changes adding new features are only allowed for Python2.6 and above. >> > Is it possible to write byref_at in Python? There is nothing to stop > having a "ctypestools" module. > >> > To do this I need to know the structure of PyObject_HEAD which is a >> > macro which is specific to the python build. I think it would be nice if >> > ctypes included a definition of this macro. It could be generated at >> > build time and would fit well with the pythonapi module. Is there any >> > chance of something like this? > > Do you want to directly access the PyObject_HEAD fields? All you > really need is to find its size in a portable way. Fortunately Python > has the tools. By definition a builtin type 'object' instance is a > PyObject_HEAD and nothing else. And attribute object.__basicsize__ > gives its size in bytes. Nice! I'll attach a byref_at(obj, offset) implementation (or hack?) that works in ctypes 1.0.1. Well, actually it is not byref_at(obj, index) instead it is byref(obj, offset) where offset is specified in bytes. For the ctypestools module, I think it would be better to publish the byref_offset() code in the wiki, so that everyone can paste it somewhere into his code. For a single function it doesn't imo make much sense to invent a new package or module that has to be installed separately. Or should it go into the ctypeslib package? Thanks, Thomas |