Python Academy · Les

cffi: C Foreign Function Interface

Gebruik cffi voor meer Python-achtige C-interoperabiliteit met inline C-declaraties.

Les 3 van 413 stappen

cffi: C Foreign Function Interface is een gratis Python Academy-les op CoddyKit. Dit is les 3 van 4. Je kunt de volledige les hieronder gratis lezen en daarna in de browser praktisch oefenen met een ingebouwde code-editor en een AI-begeleider die 24/7 beschikbaar is. Deze les maakt deel uit van het leertraject Python Academy. Je voortgang wordt gesynchroniseerd op het web en in de CoddyKit-app. De cursus Python Academy bevat in totaal 4 lessen.

Wat is cffi?

cffi (C-interface voor externe functies) laat je C-code vanuit Python aanroepen met C-declaraties in plaats van ctypes-klassen. Het is meer idiomatisch voor Python en vaak veiliger.

# 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- versus API-modus

ffi.dlopen() is de ABI-modus — hiermee roep je tijdens uitvoering een bestaande gedeelde bibliotheek aan. De API-modus compileert een C-wrapper en is sneller en robuuster.

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

Declaraties met cdef

Gebruik ffi.cdef() om de handtekeningen van C-functies, structuren en typedefs te declareren die je vanuit Python wilt gebruiken.

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-structuren maken

Gebruik ffi.new() om geheugen voor een C-structuur te reserveren en de velden ervan vanuit Python in te stellen.

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 4

Strings en buffers

Gebruik ffi.new("char[]", n) voor veranderbare buffers en ffi.string(ptr) om een C-stringpointer om te zetten naar Python-bytes.

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 met verify

De API-modus compileert een kleine C-wrappermodule voor betere typeveiligheid en prestaties. Gebruik ffi.set_source() en bouw 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))   # 7

Callbacks van C naar Python

Gebruik ffi.callback() om een Python-functie in te pakken als een C-functiepointer die je aan een C-bibliotheek kunt doorgeven.

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 function

Geheugenbeheer

Objecten die met ffi.new() zijn toegewezen, zijn eigendom van Python en worden automatisch vrijgegeven. Gebruik ffi.gc(ptr, destructor) om een aangepaste destructor toe te voegen.

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 versus ctypes

cffi gebruikt C-declaratiestrings, wat natuurlijker is voor C-ontwikkelaars, terwijl ctypes Python-klassen gebruikt. De API-modus van cffi is sneller; voor ctypes is geen compilatie nodig.

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

cffi gebruiken met NumPy

Geef NumPy-arraygegevens rechtstreeks via cffi door aan C met ffi.cast() en de ctypes.data-pointer van de array.

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*

Fouten afhandelen met cffi

C-functies geven fouten doorgaans aan via retourwaarden. Controleer retourwaarden en gebruik ffi.errno voor POSIX-foutcodes.

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

Korte controle

Welke methode gebruikt cffi om de handtekeningen van de C-functies te declareren die je wilt aanroepen?

Samenvatting

cffi gebruikt ffi.cdef() om C-handtekeningen te declareren en ffi.dlopen() voor bibliotheekaanroepen in ABI-modus. De API-modus compileert een wrapper voor betere prestaties. Gebruik ffi.new() voor C-geheugen en ffi.callback() voor callbacks van Python naar C.

Gratis beginnen

Leer Python met een AI-tutor — gratis

Schrijf echte code en voer die uit in je browser, krijg direct hulp van een AI-tutor die 24/7 beschikbaar is en ga verder waar je gebleven bent op het web of in de app.

Cursussen
76
Lessen
320

Veelgestelde vragen

Is de les “cffi: C Foreign Function Interface” gratis?

Ja — de volledige tekst van “cffi: C Foreign Function Interface” kun je hier gratis op het web lezen. Als je interactief wilt oefenen met een ingebouwde code-editor en een AI-begeleider die 24/7 beschikbaar is, en de rest van de cursus Python Academy wilt ontgrendelen, kun je upgraden naar CoddyKit PRO. De cursus Python Academy bevat in totaal 4 lessen.

Wat leer ik in “cffi: C Foreign Function Interface”?

Gebruik cffi voor meer Python-achtige C-interoperabiliteit met inline C-declaraties. Je oefent met Python Academy door code rechtstreeks in de browser uit te voeren. Een AI-begeleider die 24/7 beschikbaar is beantwoordt je vragen terwijl je de les doorwerkt.

Heb ik ervaring nodig om met Python Academy te beginnen?

Ervaring vooraf is niet nodig. Python Academy op CoddyKit is opgebouwd voor beginners tot gevorderden, zodat je hier of bij het begin kunt starten en in je eigen tempo kunt leren. Dit is les 3 van 4.

Hoe lang duurt de les “cffi: C Foreign Function Interface”?

De meeste lessen van CoddyKit duren ongeveer 5–10 minuten. Elke les is kort en interactief, zodat je gestaag vooruitgaat en op het web en in de app precies verdergaat waar je was gebleven.

Kan ik code schrijven en uitvoeren in deze les over Python Academy?

Ja. Elke les over Python Academy bevat een ingebouwde code-editor, zodat je rechtstreeks in je browser echte code kunt schrijven en uitvoeren en direct feedback van AI krijgt — lokale installatie is niet nodig.

Alle lessen in deze cursus

  1. Waarom C-extensies? Toepassingen en afwegingen
  2. ctypes: C-bibliotheken aanroepen vanuit Python
  3. cffi: C Foreign Function Interface
  4. Een Python C-extensiemodule schrijven
← Terug naar Python Academy