ctypes ist eine Standardbibliothek zum Aufrufen dynamischer Bibliotheken aus Python. Notieren Sie sich die Lektionen / Punkte, von denen Sie süchtig waren, als Sie es kürzlich zum ersten Mal verwendeten.
Wenn Sie eine Funktion in einer dynamischen Bibliothek aufrufen, müssen Sie einen Typ angeben, der mit C kompatibel ist. (ref.) http://docs.python.jp/2/library/ctypes.html#ctypes-fundamental-data-types
Dieser Typ wird entweder beim Aufruf der Funktion angegeben oder der Rückgabewert / Argumenttyp wird vor dem Aufruf vorab durch restype
/ argtypes
angegeben.
Typenspezifikation
from ctypes import *
#Zur Laufzeit angegeben
ret = test.func2(c_char_p("test"), c_char_p("test2"), c_char_p("test3"))
# restype/Angegeben durch Argtypen
test.func2.restype = c_char_p
test.func2.argtypes = (c_char_p, c_char_p, c_char_p)
ret = test.func2("test", "test2", "test3")
Da es schwierig wird, zur Laufzeit mit zunehmender Anzahl von Aufrufen anzugeben, ist es meiner Meinung nach besser, ein Modul zu erstellen, das die Schnittstelle der Bibliothek definiert. Ist es dasselbe wie die C-Header-Datei?
interface.py
from ctypes import *
test.func1.restype = c_int
test.func2.argtypes = (None)
test.func2.restype = c_char_p
test.func2.argtypes = (c_char_p, c_char_p, c_char_p)
Strukturen werden in der Python-Welt durch Klassen dargestellt, die von ctypes.Structure
erben.
Die Mitglieder der Struktur werden in den Feldern __fields__
als Array von Taples angegeben. Der Taple muss die Form "(
Struktur und entsprechende Klasse
from ctypes import *
class JSON_T(Structure):
__fields__ = [('type', c_int), ('refcount', c_size_t)]
Wenn Sie den Zeigertyp dieser Struktur angeben möchten, verwenden Sie die Funktion ctypes.POINTER
.
(ref.)http://docs.python.jp/2/library/ctypes.html#ctypes.POINTER
Strukturzeigertyp
from ctypes import *
class JSON_T(Structure):
__fields__ = [('type', c_int), ('refcount', c_size_t)]
test.func3.restype = c_char_p
test.func3.argtypes = (c_void_p, c_char_p, c_char_p, c_char_p, POINTER(JSON_T))
Für Typen, die ursprünglich Zeiger darstellen, wie z. B. "ctypes.c_char_p" und "ctypes.c_void_p", können Sie die Funktion "ctypes.POINTER" verwenden.
Zeigertyp des Zeigers(Ursprünglich ein Typ, der einen Zeiger darstellt)
from ctypes import *
test.func4.restype = c_char_p
test.func4.argtypes = (c_void_p, c_char_p, c_char_p, c_char_p, POINTER(c_void_p), POINTER(c_char_p))
Wenn Sie diese verwenden, müssen Sie die in ctypes.c_char_p
/ ctypes.c_void_p
angegebene Variable der Funktion ctypes.byref
übergeben, um eine Referenz zu erhalten.
Behandeln Sie zeigerartige Argumente von Zeigern
from ctypes import *
test.func4.restype = c_char_p
test.func4.argtypes = (c_void_p, c_char_p, c_char_p, c_char_p, POINTER(c_void_p), POINTER(c_char_p))
#arg1 ist bereits definiert
arg2 = 'str2'
arg3 = 'str3'
arg4 = 'str4'
void_p_p = c_void_p(None)
char_p_p = c_char_p(None)
#Wenn es unten liegt, wird dem Zeiger des Zeigers NULL zugewiesen, sodass es unbrauchbar ist.
# void_p_p = None
# char_p_p = None
test.func4(arg1, arg2, arg3, arg4, byref(void_p_p), byref(char_p_p))
(Hinweis) Ich kenne die Typen, die primitive Typen wie ctypes.c_int
darstellen, nicht, da ich sie diesmal nicht verwendet habe. Verwenden Sie die Funktion ctypes.POINTER
zweimal?
Recommended Posts