0Pricing
Python Academy · Leçon

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.0

Transmettre 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.0

Tableaux

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 50

Rappels (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 comparator

Charger 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

  1. Pourquoi les extensions C ? Cas d’usage et compromis
  2. ctypes : appeler des bibliothèques C depuis Python
  3. cffi : interface de fonctions externes C
  4. Écrire un module d’extension C pour Python
← Retour à Python Academy