[PYTHON] (Persönliche) Punkte bei Verwendung von ctypes

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.

Stellen Sie sicher, dass Sie Restype und Argtypes angeben

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)

Angeben des Zeigertyps der Struktur

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 "(, )" haben.

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))

Angeben des Zeigertyps des Zeigers

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

(Persönliche) Punkte bei Verwendung von ctypes
Zusammenfassung bei Verwendung von Fabric
Vorsichtsmaßnahmen bei der Verwendung von Chainer
Umgebungsvariablen bei Verwendung von Tkinter
Bei Verwendung von optparse mit iPython
Suchtpunkte beim Herunterladen von Dateien mit boto auf AWS Lambda
DEBUG-Einstellungen bei Verwendung von Django
Bei Verwendung von if und bei Verwendung von while
Dateistruktur bei Verwendung von Serverless-Python-Anforderungen
Verwenden Sie configparser, wenn Sie die API verwenden
Ein Memorandum bei der Verwendung von schöner Suppe
Variabler Umfang bei Verwendung interner Funktionen
Punkte, die beim Aktualisieren auf WSL2 zu beachten sind
Gegenmaßnahmen gegen Proxy bei Verwendung der WEB-API
Vorsichtsmaßnahmen bei der Verwendung von Pit mit Python
Vorsichtsmaßnahmen bei der Verwendung der TextBlob-Merkmalsanalyse
Vorsichtsmaßnahmen bei der Verwendung von Codecs und Pandas
Vorsichtsmaßnahmen bei Verwendung der Funktion urllib.parse.quote
[Python] Seien Sie vorsichtig, wenn Sie Druck verwenden
Vorsichtsmaßnahmen bei der Verwendung von Phantomjs aus Python
ResourceWarning bei Verwendung von Anforderungen: nicht geschlossene Problemumgehung
Bei Verwendung von MeCab mit virtualenv python
Vorsichtsmaßnahmen bei Verwendung von sechs mit Python 2.5
Bei Verwendung regulärer Ausdrücke in Python
Überprüfen Sie Punkte, wenn MIDI in einem Programm mit SDL_mixer nicht funktioniert
Organisieren Sie den Fluss, wenn Sie Django mit NGINX und Gunicorn ausführen (persönliches Memo).