ctypes: C-bibliotheken aanroepen vanuit Python
Laad gedeelde bibliotheken en roep C-functies aan met ctypes.
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.0Pointers 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.0Arrays
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 50Callbacks (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 comparatorWindows-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.
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
- Waarom C-extensies? Toepassingen en afwegingen
- ctypes: C-bibliotheken aanroepen vanuit Python
- cffi: C Foreign Function Interface
- Een Python C-extensiemodule schrijven