ctypes: Kald af C-biblioteker fra Python
Indlæs delte biblioteker, og kald C-funktioner med ctypes.
ctypes: Kald af C-biblioteker fra Python er en gratis Python Academy-lektion på CoddyKit. Dette er lektion 2 af 4. Du kan læse hele lektionen gratis nedenfor — og derefter øve dig praktisk i browseren med en indbygget kodeeditor og en AI-vejleder, der er tilgængelig døgnet rundt. Den er en del af læringsforløbet i Python Academy, og dine fremskridt synkroniseres på tværs af nettet og CoddyKit-appen. Python Academy-kurset indeholder 4 lektioner i alt.
Hvad er ctypes?
ctypes er et modul i standardbiblioteket til at indlæse delte C-biblioteker og kalde deres funktioner fra Python — der kræves ingen kompilering.
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!")Indlæsning af biblioteker
Brug ctypes.CDLL til cdecl-kaldskonventionen (de fleste C-biblioteker) og WinDLL til Windows' stdcall-API'er.
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-datatyper
Forbind Python-typer med C-typer ved hjælp af ctypes-klasser: c_int, c_double, c_char_p, c_void_p osv.
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"Angivelse af argtypes og restype
Deklarér altid argtypes (parametertyper) og restype (returtype) for at undgå tavse nedbrud på grund af typeuoverensstemmelser.
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.0Videregivning af pointere
Brug ctypes.byref(var) eller ctypes.pointer(var) til at videregive en pointer til en C-variabel.
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)Strukturer
Definér C-strukturer ved at nedarve fra ctypes.Structure og angive _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.0Arrays
Opret C-arrays med 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 50Tilbagekald (funktionspointere)
Brug ctypes.CFUNCTYPE til at oprette en Python-funktion, der kan kaldes fra C, og videregive den som et tilbagekald.
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 comparatorIndlæsning af Windows-DLL'er
På Windows skal du bruge ctypes.WinDLL til DLL'er, der bruger stdcall-konventionen (f.eks. Windows-API'et).
import ctypes # Windows only
kernel32 = ctypes.WinDLL("kernel32", use_last_error=True)
kernel32.GetTickCount.restype = ctypes.c_ulong
print(kernel32.GetTickCount())Fejlhåndtering
Kontrollér ctypes.get_last_error() (Windows), eller brug try/except på Python-niveau til fejl, der returneres som særlige værdier.
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()))Praktisk eksempel: SHA-256 med OpenSSL
Kald OpenSSL's SHA256 direkte via ctypes uden et bibliotek til Python-bindinger.
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())Hurtigt tjek
Hvorfor skal du altid angive argtypes og restype for en ctypes-funktion?
Opsummering
ctypes indlæser delte C-biblioteker uden kompilering. Deklarér argtypes og restype for hver funktion. Brug Structure til C-strukturer, TypeClass * N til arrays og CFUNCTYPE til tilbagekald.
Lær Python med en AI-underviser — gratis
Skriv og kør rigtig kode i din browser, få øjeblikkelig hjælp fra en AI-underviser døgnet rundt, og fortsæt, hvor du slap, på web eller i appen.
- Kurser
- 76
- Lektioner
- 320
Ofte stillede spørgsmål
Er lektionen “ctypes: Kald af C-biblioteker fra Python” gratis?
Ja — hele teksten til “ctypes: Kald af C-biblioteker fra Python” kan læses gratis her på nettet. Hvis du vil øve dig interaktivt med en indbygget kodeeditor og en AI-vejleder døgnet rundt og få adgang til resten af Python Academy-kurset, skal du opgradere til CoddyKit PRO. Python Academy-kurset indeholder 4 lektioner i alt.
Hvad lærer jeg i “ctypes: Kald af C-biblioteker fra Python”?
Indlæs delte biblioteker, og kald C-funktioner med ctypes. Du øver dig i Python Academy med praktisk kode, som du kører direkte i browseren, og en AI-vejleder døgnet rundt besvarer dine spørgsmål, mens du arbejder dig gennem lektionen.
Skal jeg have erfaring for at begynde på Python Academy?
Der kræves ingen tidligere erfaring. Python Academy på CoddyKit er tilrettelagt for både begyndere og øvede, så du kan starte her eller fra begyndelsen og lære i dit eget tempo. Dette er lektion 2 af 4.
Hvor lang tid tager lektionen “ctypes: Kald af C-biblioteker fra Python”?
De fleste CoddyKit-lektioner tager cirka 5–10 minutter. Hver lektion er kort og interaktiv, så du gør løbende fremskridt og kan fortsætte, hvor du slap – på både web og app.
Kan jeg skrive og køre kode i denne Python Academy-lektion?
Ja. Alle Python Academy-lektioner har en indbygget kodeeditor, så du kan skrive og køre rigtig kode direkte i din browser og få øjeblikkelig feedback fra AI – uden lokal opsætning.
Alle lektioner i dette kursus
- Hvorfor C-udvidelser? Anvendelser og afvejninger
- ctypes: Kald af C-biblioteker fra Python
- cffi: C Foreign Function Interface
- Skrivning af et Python-C-udvidelsesmodul