Re: [ctypes-users] fun with ctypes
Brought to you by:
theller
From: Thomas H. <th...@ct...> - 2007-04-26 19:24:43
|
Simon Burton schrieb: > On Wed, 28 Feb 2007 21:05:33 +0100 > Thomas Heller <th...@ct...> wrote: > >> Sure, you can access the 'PyObject' fields with it, but to >> call functions from the Python api the ctypes.py_object type should >> be used instead. > >>>> import ctypes >>>> class A(object):pass > ... >>>> a=A() >>>> a.b=1 >>>> aa=ctypes.py_object(a) >>>> capi=ctypes.pythonapi >>>> b=capi.PyObject_GetAttrString(aa,'b') >>>> b > 134537008 >>>> type(b) > <type 'int'> >>>> > > well... i assume this b is the address of the int object.. is there > a way to get a py_object from an int address ? Yes: py_object.from_address(an_integer_address). Works for any ctypes type. But easier, and safer, is to set the restype attribute of the PyObject_FromString function: capi.PyObject_GetAttrString.restype = py_object b = capi.PyObject_GetAttrString(aa,'b') In this way it will return the integer 1, and refcounts will be managed correctly. Also, you will get an exception when the PyObject_GetAttrString returns NULL. If you even set argtypes: capi.PyObject_GetAttrString.argtypes = (py_object, c_char_p) you can save the wrapping of the A() object into a py_object call, the function call will do this automatically, and will check if you pass a string as second parameter. Also, to answer the question in your other post: Yes, ctypes releases the GIL during function calls, but only for function calls done via cdll or windll, not via pydll or the pythonapi object. Also, pydll calls check the PyErr_Occurred() function after the call. This is outlined in the docs. BTW: I never had the use case myself to call Python API functions via ctypes, but I know that some people have sucessfully used it. If you need to do this I strongly recommend to use the module that Lenard Lindstrom contributed; it is in the ctypeslib package that you can download with 'easy_install ctypeslib' (or was it 'easy_install ctypeslib==dev' ? not sure). Thomas |