Помогите мне понять, почему мое тривиальное использование ctypes модуля Python перестало работать

Я пытаюсь понять Python "ctypes" модуль. Я соединил тривиальный пример, который - идеально - переносит statvfs () вызов функции. Код похож на это:

from ctypes import *

class struct_statvfs (Structure):
    _fields_ = [
            ('f_bsize', c_ulong),
            ('f_frsize', c_ulong),
            ('f_blocks', c_ulong),
            ('f_bfree', c_ulong),
            ('f_bavail', c_ulong),
            ('f_files', c_ulong),
            ('f_ffree', c_ulong),
            ('f_favail', c_ulong),
            ('f_fsid', c_ulong),
            ('f_flag', c_ulong),
            ('f_namemax', c_ulong),
            ]


libc = CDLL('libc.so.6')
libc.statvfs.argtypes = [c_char_p, POINTER(struct_statvfs)]
s = struct_statvfs()

res = libc.statvfs('/etc', byref(s))
print 'return = %d, f_bsize = %d, f_blocks = %d, f_bfree = %d' % (
    res, s.f_bsize, s.f_blocks, s.f_bfree)

Выполнение этого неизменно возвращается:

return = 0, f_bsize = 4096, f_blocks = 10079070, f_bfree = 5048834
*** glibc detected *** python: free(): invalid next size (fast): 0x0000000001e51780 ***
*** glibc detected *** python: malloc(): memory corruption (fast): 0x0000000001e517e0 ***

Я не смог найти любые примеры вызывания функций с составными типами как параметры (существует много примеров функций, которые возвращают составные типы), но после того, чтобы уставиться на ctypes документацию в течение приблизительно одного дня я думаю, что мой синтаксис вызова правилен..., и это на самом деле называет statvfs () вызовом и возвращает корректные результаты.

Я неправильно понимаю ctypes документы? Или что-то еще продолжается здесь?

Спасибо!

5
задан larsks 10 August 2010 в 13:29
поделиться