Python Academy · Les

ctypes: C-bibliotheken aanroepen vanuit Python

Laad gedeelde bibliotheken en roep C-functies aan met ctypes.

Les 2 van 413 stappen

ctypes: C-bibliotheken aanroepen vanuit Python is een gratis Python Academy-les op CoddyKit. Dit is les 2 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 ctypes?

ctypes is een module uit de standaardbibliotheek voor het laden van gedeelde C-bibliotheken en het aanroepen van hun functies vanuit Python — compilatie is niet nodig.

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

Bibliotheken laden

Gebruik ctypes.CDLL voor de cdecl-aanroepconventie (de meeste C-bibliotheken) en WinDLL voor Windows-API's met de stdcall-aanroepconventie.

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

C-gegevenstypen

Breng Python-typen in kaart naar C-typen met ctypes-klassen: c_int, c_double, c_char_p, c_void_p enzovoort.

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"

argtypes en restype instellen

Declareer altijd argtypes (parametertypen) en restype (retourtype) om stille crashes door niet-overeenkomende typen te voorkomen.

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

Pointers doorgeven

Gebruik ctypes.byref(var) of ctypes.pointer(var) om een pointer naar een C-variabele door te geven.

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)

Structuren

Definieer C-structuren door ctypes.Structure te subklassen en _fields_ op te sommen.

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

Arrays

Maak C-arrays met 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

Callbacks (functie-pointers)

Gebruik ctypes.CFUNCTYPE om een vanuit C aanroepbare Python-functie te maken die je als callback kunt doorgeven.

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

Windows-DLL's laden

Gebruik op Windows ctypes.WinDLL voor DLL's die de stdcall-aanroepconventie gebruiken, zoals de Windows-API.

import ctypes   # Windows only

kernel32 = ctypes.WinDLL("kernel32", use_last_error=True)
kernel32.GetTickCount.restype = ctypes.c_ulong
print(kernel32.GetTickCount())

Fouten afhandelen

Controleer ctypes.get_last_error() (Windows) of gebruik try/except op Python-niveau voor fouten die als speciale waarden worden teruggegeven.

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

Praktijkvoorbeeld: SHA-256 met OpenSSL

Roep SHA256 van OpenSSL rechtstreeks aan via ctypes, zonder een Python-bindingbibliotheek.

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

Korte controle

Waarom moet je altijd argtypes en restype instellen voor een ctypes-functie?

Samenvatting

ctypes laadt gedeelde C-bibliotheken zonder compilatie. Declareer argtypes en restype voor elke functie. Gebruik Structure voor C-structuren, TypeClass * N voor arrays en CFUNCTYPE voor callbacks.

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 “ctypes: C-bibliotheken aanroepen vanuit Python” gratis?

Ja — de volledige tekst van “ctypes: C-bibliotheken aanroepen vanuit Python” 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 “ctypes: C-bibliotheken aanroepen vanuit Python”?

Laad gedeelde bibliotheken en roep C-functies aan met ctypes. 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 2 van 4.

Hoe lang duurt de les “ctypes: C-bibliotheken aanroepen vanuit Python”?

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