ctypes: return a pointer to a struct

Jack nospam at invalid.com
Fri Apr 25 05:39:58 CEST 2008


Thanks for the prompt and detailed reply. I tried that but was getting this 
error:

AttributeError: 'LP_IP2LocationRecord' object has no attribute 
'country_short'

Here's my version, which I think is equivalent to yours:
(as a matter of fact, I also tried yours and got the same error.)

class IP2LocationRecord(Structure):
    _fields_ = [("country_short", c_char_p),
                ("country_long", c_char_p),
                ("region", c_char_p),
                ("city", c_char_p),
                ("isp", c_char_p),
                ("latitude", c_float),
                ("longitude", c_float),
                ("domain", c_char_p),
                ("zipcode", c_char_p),
                ("timezone", c_char_p),
                ("netspeed", c_char_p)]

IP2Location_get_all.restype = POINTER(IP2LocationRecord)
IP2LocationObj = IP2Location_open(thisdir + '/IP-COUNTRY-SAMPLE.BIN')
rec = IP2Location_get_all(IP2LocationObj, '64.233.167.99')
print rec.country_short
IP2Location_close(IP2LocationObj)


"sturlamolden" <sturlamolden at yahoo.no> wrote in message 
news:4dda2bd7-3348-496e-a594-35da0a34d4de at x35g2000hsb.googlegroups.com...
> On Apr 25, 5:15 am, sturlamolden <sturlamol... at yahoo.no> wrote:
>
>> First define a struct type IP2LocationRecord by subclassing from
>> ctypes.Structure. Then define a pointer type as
>> ctypes.POINTER(IP2LocationRecord) and set that as the function's
>> restype attribute. See the ctypes tutorial or reference for details.
>
> Which is to say:
>
> import ctypes
>
> class IP2LocationRecord(ctypes.Structure):
> _fields_ = [
> ('country_short', ctypes.c_char_p),
> ('country_long', ctypes.c_char_p),
> ('region', ctypes.c_char_p),
> ('city', ctypes.c_char_p),
> ('isp', ctypes.c_char_p),
> ('latitude', ctypes.c_float),
> ('longitude', ctypes.c_float),
> ('domain', ctypes.c_char_p),
> ('zipcode', ctypes.c_char_p),
> ('timezone', ctypes.c_char_p),
> ('netspeed', ctypes.c_char_p),
>   ]
>
> IP2LocationRecord_Ptr_t = ctypes.POINTER(IP2LocationRecord)
>
> function.restype = IP2LocationRecord_Ptr_t
>
> 





More information about the Python-list mailing list