ctypes : appeler des bibliothèques C depuis Python
Chargez des bibliothèques partagées et appelez des fonctions C avec ctypes.
ctypes : appeler des bibliothèques C depuis Python est une leçon Python Academy gratuite sur CoddyKit. Ceci est la leçon 2 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 ctypes ?
ctypes est un module de la bibliothèque standard qui permet de charger des bibliothèques C partagées et d’appeler leurs fonctions depuis Python, sans compilation.
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!")Charger des bibliothèques
Utilisez ctypes.CDLL pour la convention d’appel cdecl (la plupart des bibliothèques C) et WinDLL pour les API Windows utilisant stdcall.
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...Types de données C
Associez les types Python aux types C à l’aide des classes ctypes : c_int, c_double, c_char_p, c_void_p, etc.
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"Définir argtypes et restype
Déclarez toujours argtypes (types des paramètres) et restype (type de retour) afin d’éviter les plantages silencieux dus à des incompatibilités de types.
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.0Transmettre des pointeurs
Utilisez ctypes.byref(var) ou ctypes.pointer(var) pour transmettre un pointeur vers une variable C.
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)Structures
Définissez les structures C en dérivant de ctypes.Structure et en indiquant _fields_.
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.0Tableaux
Créez des tableaux C avec 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 50Rappels (pointeurs de fonctions)
Utilisez ctypes.CFUNCTYPE pour créer une fonction Python appelable depuis C et la transmettre comme rappel.
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 comparatorCharger des DLL Windows
Sous Windows, utilisez ctypes.WinDLL pour les DLL qui utilisent la convention stdcall, par exemple l’API Windows.
import ctypes # Windows only
kernel32 = ctypes.WinDLL("kernel32", use_last_error=True)
kernel32.GetTickCount.restype = ctypes.c_ulong
print(kernel32.GetTickCount())Gestion des erreurs
Vérifiez ctypes.get_last_error() sous Windows, ou utilisez try/except au niveau Python pour les erreurs renvoyées sous forme de valeurs spéciales.
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()))Exemple pratique : SHA-256 avec OpenSSL
Appelez directement SHA256 d’OpenSSL via ctypes, sans aucune bibliothèque de liaison Python.
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())Vérification rapide
Pourquoi devez-vous toujours définir argtypes et restype sur une fonction ctypes ?
Récapitulatif
ctypes charge des bibliothèques C partagées sans compilation. Déclarez argtypes et restype pour chaque fonction. Utilisez Structure pour les structures C, TypeClass * N pour les tableaux et CFUNCTYPE pour les rappels.
Questions Fréquemment Posées
La leçon « ctypes : appeler des bibliothèques C depuis Python » est-elle gratuite ?
Oui — le texte complet de « ctypes : appeler des bibliothèques C depuis Python » 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 « ctypes : appeler des bibliothèques C depuis Python » ?
Chargez des bibliothèques partagées et appelez des fonctions C avec ctypes. 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 2 sur 4.
Combien de temps prend la leçon « ctypes : appeler des bibliothèques C depuis Python » ?
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