ctypes: C-Bibliotheken aus Python aufrufen
Laden Sie gemeinsam genutzte Bibliotheken und rufen Sie C-Funktionen mit ctypes auf.
ctypes: C-Bibliotheken aus Python aufrufen ist eine kostenlose Python Academy-Lektion auf CoddyKit. Dies ist Lektion 2 von 4. Du kannst die komplette Lektion unten kostenlos lesen – dann übst du sie direkt im Browser mit einem integrierten Code-Editor und einem KI-Tutor rund um die Uhr. Sie ist Teil des Python Academy-Lernpfads, und dein Fortschritt wird über Web und CoddyKit-App synchronisiert. Der Python Academy-Kurs umfasst insgesamt 4 Lektionen.
Was ist ctypes?
ctypes ist ein Standardbibliotheksmodul zum Laden gemeinsam genutzter C-Bibliotheken und zum Aufrufen ihrer Funktionen aus Python – eine Kompilierung ist nicht erforderlich.
import ctypes
# Load the C standard library
libc = ctypes.CDLL("libc.so.6") # Linux
# libc = ctypes.CDLL("libSystem.dylib") # macOS
libc.puts(b"Hello from C!")Bibliotheken laden
Verwenden Sie ctypes.CDLL für die cdecl-Aufrufkonvention (die meisten C-Bibliotheken) und WinDLL für Windows-APIs mit der stdcall-Aufrufkonvention.
import ctypes
# Platform-independent approach:
import ctypes.util
libm_name = ctypes.util.find_library("m")
libm = ctypes.CDLL(libm_name)
result = libm.sqrt
result.restype = ctypes.c_double
result.argtypes = [ctypes.c_double]
print(result(2.0)) # 1.4142...C-Datentypen
Ordnen Sie Python-Typen mithilfe von ctypes-Klassen C-Typen zu: c_int, c_double, c_char_p, c_void_p usw.
import ctypes
x = ctypes.c_int(42)
print(x.value) # 42
d = ctypes.c_double(3.14)
print(d.value) # 3.14
s = ctypes.c_char_p(b"hello")
print(s.value) # b"hello"argtypes und restype festlegen
Deklarieren Sie immer argtypes (Parametertypen) und restype (Rückgabetyp), um stille Abstürze aufgrund inkompatibler Typen zu vermeiden.
import ctypes, ctypes.util
libm = ctypes.CDLL(ctypes.util.find_library("m"))
libm.pow.argtypes = [ctypes.c_double, ctypes.c_double]
libm.pow.restype = ctypes.c_double
print(libm.pow(2.0, 10.0)) # 1024.0Zeiger übergeben
Verwenden Sie ctypes.byref(var) oder ctypes.pointer(var), um einen Zeiger auf eine C-Variable zu übergeben.
import ctypes
libc = ctypes.CDLL(None) # None = current process
value = ctypes.c_int(0)
# Passing pointer to C function:
# libc.some_func(ctypes.byref(value))
print(value.value)Strukturen
Definieren Sie C-Strukturen, indem Sie ctypes.Structure ableiten und _fields_ auflisten.
import ctypes
class Point(ctypes.Structure):
_fields_ = [
("x", ctypes.c_double),
("y", ctypes.c_double),
]
p = Point(1.0, 2.0)
print(p.x, p.y) # 1.0 2.0Arrays
Erstellen Sie C-Arrays mit TypeClass * N.
import ctypes
IntArray5 = ctypes.c_int * 5
arr = IntArray5(10, 20, 30, 40, 50)
for v in arr:
print(v, end=" ") # 10 20 30 40 50Callbacks (Funktionszeiger)
Verwenden Sie ctypes.CFUNCTYPE, um eine aus C aufrufbare Python-Funktion zu erstellen, die als Callback übergeben werden kann.
import ctypes
CompareFunc = ctypes.CFUNCTYPE(ctypes.c_int, ctypes.c_int, ctypes.c_int)
def my_compare(a, b):
return a - b
c_compare = CompareFunc(my_compare)
# Pass c_compare to a C function expecting a comparatorWindows-DLLs laden
Verwenden Sie unter Windows ctypes.WinDLL für DLLs mit der stdcall-Aufrufkonvention (z. B. die Windows-API).
import ctypes # Windows only
kernel32 = ctypes.WinDLL("kernel32", use_last_error=True)
kernel32.GetTickCount.restype = ctypes.c_ulong
print(kernel32.GetTickCount())Fehlerbehandlung
Prüfen Sie ctypes.get_last_error() (Windows) oder verwenden Sie eine Python-seitige try/except-Behandlung für Fehler, die als spezielle Rückgabewerte signalisiert werden.
import ctypes
# Many C functions return -1 or NULL on error:
result = some_c_function()
if result == -1:
raise OSError("C function failed")
# For errno on POSIX:
import os
if result < 0:
raise OSError(os.strerror(ctypes.get_errno()))Praxisbeispiel: SHA-256 mit OpenSSL
Rufen Sie OpenSSLs SHA256 direkt über ctypes auf, ohne eine Python-Binding-Bibliothek zu verwenden.
import ctypes, ctypes.util
libcrypto = ctypes.CDLL(ctypes.util.find_library("crypto"))
SHA256 = libcrypto.SHA256
SHA256.argtypes = [ctypes.c_char_p, ctypes.c_size_t, ctypes.c_char_p]
SHA256.restype = ctypes.c_char_p
buf = ctypes.create_string_buffer(32)
SHA256(b"hello", 5, buf)
print(buf.raw.hex())Schnelltest
Warum sollten Sie bei einer ctypes-Funktion immer argtypes und restype festlegen?
Zusammenfassung
ctypes lädt gemeinsam genutzte C-Bibliotheken ohne Kompilierung. Deklarieren Sie für jede Funktion argtypes und restype. Verwenden Sie Structure für C-Strukturen, TypeClass * N für Arrays und CFUNCTYPE für Callbacks.
Häufig gestellte Fragen
Ist die Lektion „ctypes: C-Bibliotheken aus Python aufrufen“ kostenlos?
Ja — der vollständige Text von „ctypes: C-Bibliotheken aus Python aufrufen“ ist hier im Web kostenlos zu lesen. Um sie interaktiv zu üben (integrierter Code-Editor und 24/7 KI-Tutor) und den Rest des Python Academy-Kurses freizuschalten, upgrade auf CoddyKit PRO. Der Python Academy-Kurs umfasst insgesamt 4 Lektionen.
Was lerne ich in „ctypes: C-Bibliotheken aus Python aufrufen“?
Laden Sie gemeinsam genutzte Bibliotheken und rufen Sie C-Funktionen mit ctypes auf. Du übst Python Academy mit praktischem Code, den du direkt im Browser ausführst, und ein 24/7 KI-Tutor beantwortet deine Fragen während du die Lektion bearbeitest.
Brauche ich Erfahrung, um Python Academy zu starten?
Keine Vorkenntnisse erforderlich. Python Academy auf CoddyKit ist für Anfänger bis fortgeschrittene Lernende strukturiert, sodass du hier starten oder von Anfang an beginnen und in deinem eigenen Tempo voranschreiten kannst. Dies ist Lektion 2 von 4.
Wie lange dauert die Lektion „ctypes: C-Bibliotheken aus Python aufrufen“?
Die meisten CoddyKit-Lektionen dauern etwa 5–10 Minuten. Jede ist kompakt und interaktiv, sodass du stetig Fortschritte machst und genau dort weitermachst, wo du aufgehört hast – im Web und in der App.
Kann ich in dieser Python Academy-Lektion Code schreiben und ausführen?
Ja. Jede Python Academy-Lektion enthält einen integrierten Code-Editor, sodass du echten Code direkt in deinem Browser schreibst und ausführst und sofort KI-Feedback erhältst — ohne lokale Einrichtung erforderlich.
Alle Lektionen in diesem Kurs
- Warum C-Erweiterungen? Anwendungsfälle und Abwägungen
- ctypes: C-Bibliotheken aus Python aufrufen
- cffi: C Foreign Function Interface
- Ein Python-C-Erweiterungsmodul schreiben