cffi: C Foreign Function Interface
Verwenden Sie cffi für eine Python-typischere C-Interop mit eingebetteten C-Deklarationen.
cffi: C Foreign Function Interface ist eine kostenlose Python Academy-Lektion auf CoddyKit. Dies ist Lektion 3 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 cffi?
cffi (C Foreign Function Interface) ermöglicht es Ihnen, C-Code aus Python mithilfe von C-Deklarationen statt ctypes-Klassen aufzurufen. Es ist pythonischer und oft sicherer.
# pip install cffi
from cffi import FFI
ffi = FFI()
ffi.cdef("double sqrt(double x);")
libm = ffi.dlopen(None) # current process
print(libm.sqrt(2.0)) # 1.4142...ABI- und API-Modus
ffi.dlopen() ist der ABI-Modus – er ruft zur Laufzeit eine vorhandene gemeinsam genutzte Bibliothek auf. Der API-Modus kompiliert einen C-Wrapper und ist schneller sowie robuster.
from cffi import FFI
ffi = FFI()
# ABI mode (no compile step):
ffi.cdef("int abs(int x);")
libc = ffi.dlopen("libc.so.6") # Linux
print(libc.abs(-42)) # 42cdef-Deklarationen
Verwenden Sie ffi.cdef(), um die Signaturen von C-Funktionen, Strukturen und Typedefs zu deklarieren, die Sie aus Python verwenden möchten.
from cffi import FFI
ffi = FFI()
ffi.cdef("""
typedef struct {
double x;
double y;
} Point;
double distance(Point a, Point b);
""")
# lib = ffi.dlopen("mylib.so")C-Strukturen erstellen
Verwenden Sie ffi.new(), um eine C-Struktur zu reservieren und ihre Felder aus Python zu setzen.
from cffi import FFI
ffi = FFI()
ffi.cdef("typedef struct { int x; int y; } Vec2;")
lib = ffi.dlopen(None)
v = ffi.new("Vec2 *")
v.x = 3
v.y = 4
print(v.x, v.y) # 3 4Strings und Puffer
Verwenden Sie ffi.new("char[]", n) für veränderbare Puffer und ffi.string(ptr), um einen C-String-Zeiger in Python-Bytes umzuwandeln.
from cffi import FFI
ffi = FFI()
buf = ffi.new("char[]", b"hello world")
print(ffi.string(buf)) # b"hello world"
# Mutable buffer for output:
out = ffi.new("char[128]")
# c_func(out, 128) # fill the buffer
# result = ffi.string(out).decode()API-Modus mit verify
Der API-Modus kompiliert ein kleines C-Wrapper-Modul, das eine bessere Typsicherheit und Leistung bietet. Verwenden Sie ffi.set_source() und erstellen Sie das Modul offline.
from cffi import FFI
ffi = FFI()
ffi.cdef("int add(int a, int b);")
ffi.set_source("_mylib",
"""
int add(int a, int b) { return a + b; }
"""
)
# Build: python build_mylib.py
# from _mylib import ffi, lib
# print(lib.add(3, 4)) # 7Callbacks von C nach Python
Verwenden Sie ffi.callback(), um eine Python-Funktion als C-Funktionszeiger zu verpacken, der an eine C-Bibliothek übergeben werden kann.
from cffi import FFI
ffi = FFI()
ffi.cdef("typedef int (*compare_fn)(int, int);")
@ffi.callback("int(int, int)")
def compare(a, b):
return a - b
# pass compare to a C sort functionSpeicherverwaltung
Objekte, die mit ffi.new() reserviert wurden, gehören Python und werden automatisch freigegeben. Verwenden Sie ffi.gc(ptr, destructor), um einen eigenen Destruktor zuzuweisen.
from cffi import FFI
ffi = FFI()
# ptr freed when Python GC collects it:
buf = ffi.new("int[10]")
buf[0] = 42
print(buf[0]) # 42
# Custom destructor:
# ptr = ffi.gc(lib.alloc(), lib.free)cffi und ctypes
cffi verwendet C-Deklarationszeichenfolgen (für C-Entwickler natürlicher), während ctypes Python-Klassen verwendet. Der API-Modus von cffi ist schneller; ctypes erfordert keine Kompilierung.
# ctypes approach:
import ctypes
libc = ctypes.CDLL("libc.so.6")
libc.abs.restype = ctypes.c_int
libc.abs.argtypes = [ctypes.c_int]
print(libc.abs(-5)) # 5
# cffi approach:
from cffi import FFI; ffi = FFI()
ffi.cdef("int abs(int);")
lib = ffi.dlopen(None)
print(lib.abs(-5)) # 5cffi mit NumPy verwenden
Übergeben Sie die Daten eines NumPy-Arrays direkt über cffi an C, indem Sie ffi.cast() und den ctypes.data-Zeiger des Arrays verwenden.
import numpy as np
from cffi import FFI
ffi = FFI()
arr = np.array([1.0, 2.0, 3.0])
ptr = ffi.cast("double *", arr.ctypes.data)
# Now ptr can be passed to a C function expecting double*Fehlerbehandlung mit cffi
C-Funktionen signalisieren Fehler normalerweise über Rückgabewerte. Prüfen Sie die Rückgabewerte und verwenden Sie ffi.errno für POSIX-Fehlercodes.
import errno as errno_mod
from cffi import FFI
ffi = FFI()
ffi.cdef("int open(const char *path, int flags);")
lib = ffi.dlopen(None)
fd = lib.open(b"/nonexistent", 0)
if fd == -1:
err = ffi.errno
raise OSError(err, "open failed")Schnelltest
Mit welcher Methode deklariert cffi die Signaturen der C-Funktionen, die Sie aufrufen möchten?
Zusammenfassung
cffi verwendet ffi.cdef(), um C-Signaturen zu deklarieren, und ffi.dlopen() für Bibliotheksaufrufe im ABI-Modus. Der API-Modus kompiliert einen Wrapper für bessere Leistung. Verwenden Sie ffi.new() für C-Speicher und ffi.callback() für Python-zu-C-Callbacks.
Häufig gestellte Fragen
Ist die Lektion „cffi: C Foreign Function Interface“ kostenlos?
Ja — der vollständige Text von „cffi: C Foreign Function Interface“ 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 „cffi: C Foreign Function Interface“?
Verwenden Sie cffi für eine Python-typischere C-Interop mit eingebetteten C-Deklarationen. 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 3 von 4.
Wie lange dauert die Lektion „cffi: C Foreign Function Interface“?
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