Ich versuche, das Python "Ctypes" -Modul zu verstehen. Ich habe ein triviales Beispiel zusammengestellt, das im Idealfall den Funktionsaufruf statvfs() umschließt. Der Code sieht wie folgt aus:Helfen Sie mir zu verstehen, warum meine triviale Verwendung von Pythons Ctypes-Modul fehlschlägt
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)
Ausführen dieses immer wieder:
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 ***
Ich habe nicht in der Lage gewesen, alle Beispiele Aufruf von Funktionen mit komplexen Typen wie Parameter finden (es gibt viele Beispiele von Funktionen, die komplexe Typen zurückgeben, aber nach dem Anschauen der Ctypes-Dokumentation für einen Tag oder so denke ich, dass meine Aufrufsyntax korrekt ist ... und es tatsächlich den statvfs() -Aufruf aufruft und korrekte Ergebnisse zurückbekommt.
Bin ich Missverständnis der Ctypes Docs? Oder geht hier etwas anderes vor?
Danke!
Ich konnte noch keine Antwort finden, aber ich kann Ihnen sagen, dass Ihr Code für mich funktioniert, wenn ich ihn als Skript ausführe, aber es verursacht einen Segfault, wenn ich ihn im interaktiven Interpreter starte. Insbesondere verursacht es einen Segfault nach einer scheinbar zufälligen Zeitspanne oder wenn der Interpreter beendet wird, je nachdem, was zuerst eintritt.Ich werde weiter versuchen, das herauszufinden, aber ich dachte mir, dass diese Information das Problem für jemanden, der besser informiert ist, beleuchten könnte. –
Ein Problem könnte sein, dass Sie die Klasse struct_statvfs nicht richtig definieren müssen, z. Dein ist kleiner als das, was die libc denkt. Führen Sie dieses kleine C-Programm aus, um Folgendes zu überprüfen: #include int main() {return! Printf ("% d \ n", sizeof (struct statvfs)); } –
pts
Falsche und veraltete Dokumentation ist schlimmer als keine Dokumentation. Es ist mir nicht in den Sinn gekommen, die Definition für eine Struktur (nicht verwandt mit statvfs) zu betrachten, die mich stört. Gut, dass ich diese Frage gesehen habe. – ianalis