cffi : interface de fonctions externes C
Utilisez cffi pour une interopérabilité avec C plus idiomatique en Python, grâce aux déclarations C intégrées.
cffi : interface de fonctions externes C est une leçon Python Academy gratuite sur CoddyKit. Ceci est la leçon 3 sur 4. Tu peux lire la leçon complète ci-dessous gratuitement — puis la pratiquer en direct dans le navigateur avec un éditeur de code intégré et un tuteur IA 24/7. Elle fait partie du parcours d'apprentissage Python Academy, et ta progression se synchronise sur le web et l'application CoddyKit. Le cours Python Academy comprend 4 leçons au total.
Qu’est-ce que cffi ?
cffi (interface de fonctions externes C) permet d’appeler du code C depuis Python à l’aide de déclarations C plutôt qu’avec des classes ctypes. Son utilisation est plus naturelle en Python et souvent plus sûre.
# 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...Mode ABI contre mode API
ffi.dlopen() est le mode ABI : il appelle une bibliothèque partagée existante au moment de l’exécution. Le mode API compile une enveloppe C et s’avère plus rapide et plus robuste.
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)) # 42Déclarations cdef
Utilisez ffi.cdef() pour déclarer les signatures de fonctions C, les structures et les typedefs que vous souhaitez utiliser depuis Python.
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")Créer des structures C
Utilisez ffi.new() pour allouer une structure C et définir ses champs depuis Python.
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 4Chaînes et tampons
Utilisez ffi.new("char[]", n) pour les tampons modifiables et ffi.string(ptr) pour convertir un pointeur vers une chaîne C en octets Python.
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()Mode API avec vérification
Le mode API compile un petit module enveloppe en C afin d’améliorer la sûreté des types et les performances. Utilisez ffi.set_source() et compilez hors ligne.
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)) # 7Rappels de C vers Python
Utilisez ffi.callback() pour envelopper une fonction Python comme pointeur de fonction C pouvant être transmis à une bibliothèque C.
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 functionGestion de la mémoire
Les objets alloués avec ffi.new() appartiennent à Python et sont libérés automatiquement. Utilisez ffi.gc(ptr, destructor) pour leur associer un destructeur personnalisé.
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 contre ctypes
cffi utilise des chaînes de déclarations C, plus naturelles pour les développeurs C, tandis que ctypes utilise des classes Python. Le mode API de cffi est plus rapide ; ctypes ne nécessite aucune compilation.
# 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)) # 5Utiliser cffi avec NumPy
Transmettez directement les données d’un tableau NumPy au C via cffi en utilisant ffi.cast() et le pointeur ctypes.data du tableau.
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*Gestion des erreurs avec cffi
Les fonctions C signalent généralement les erreurs au moyen de valeurs de retour. Vérifiez ces valeurs et utilisez ffi.errno pour les codes d’erreur POSIX.
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")Vérification rapide
Quelle méthode cffi utilise-t-il pour déclarer les signatures des fonctions C que vous souhaitez appeler ?
Récapitulatif
cffi utilise ffi.cdef() pour déclarer les signatures C et ffi.dlopen() pour appeler des bibliothèques en mode ABI. Le mode API compile une enveloppe pour de meilleures performances. Utilisez ffi.new() pour la mémoire C et ffi.callback() pour les rappels de Python vers C.
Questions Fréquemment Posées
La leçon « cffi : interface de fonctions externes C » est-elle gratuite ?
Oui — le texte complet de « cffi : interface de fonctions externes C » est gratuit à lire ici sur le web. Pour la pratiquer de manière interactive (un éditeur de code intégré et un tuteur IA 24/7) et déverrouiller le reste du cours Python Academy, passe à CoddyKit PRO. Le cours Python Academy comprend 4 leçons au total.
Qu'est-ce que j'apprendrai dans « cffi : interface de fonctions externes C » ?
Utilisez cffi pour une interopérabilité avec C plus idiomatique en Python, grâce aux déclarations C intégrées. Tu pratiques Python Academy avec du code pratique que tu exécutes directement dans le navigateur, et un tuteur IA 24/7 répond à tes questions au fur et à mesure que tu avances dans la leçon.
Dois-je avoir de l'expérience pour commencer Python Academy ?
Aucune expérience préalable n'est requise. Python Academy sur CoddyKit est structuré pour les débutants jusqu'aux apprenants avancés, donc tu peux commencer ici ou depuis le début et avancer à ton rythme. Ceci est la leçon 3 sur 4.
Combien de temps prend la leçon « cffi : interface de fonctions externes C » ?
La plupart des leçons CoddyKit prennent environ 5–10 minutes. Chacune est courte et interactive, tu progresses régulièrement et tu repiques exactement où tu t'es arrêté sur le web et l'app.
Peux-tu écrire et exécuter du code dans cette leçon Python Academy ?
Oui. Chaque leçon Python Academy inclut un éditeur de code intégré, tu écris et exécutes du vrai code directement dans ton navigateur et tu reçois des retours IA instantanés — aucune configuration locale requise.
Toutes les leçons de ce cours
- Pourquoi les extensions C ? Cas d’usage et compromis
- ctypes : appeler des bibliothèques C depuis Python
- cffi : interface de fonctions externes C
- Écrire un module d’extension C pour Python