ctypes: Kalle C-biblioteker fra Python
Last inn delte biblioteker og kall C-funksjoner med ctypes.
ctypes: Kalle C-biblioteker fra Python er en gratis leksjon i Python Academy på CoddyKit. Dette er leksjon 2 av 4. Du kan lese hele leksjonen gratis nedenfor – og deretter øve praktisk i nettleseren med en innebygd kodeeditor og en AI-veileder som er tilgjengelig døgnet rundt. Den er en del av læringsløpet i Python Academy, og fremdriften din synkroniseres mellom nettet og CoddyKit-appen. Kurset i Python Academy inneholder totalt 4 leksjoner.
Hva er ctypes?
ctypes er en modul i standardbiblioteket for å laste inn delte C-biblioteker og kalle funksjonene deres fra Python – kompilering er ikke nødvendig.
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!")Laste inn biblioteker
Bruk ctypes.CDLL for kallkonvensjonen cdecl (de fleste C-biblioteker) og WinDLL for Windows-API-er med 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...C-datatyper
Tilordne Python-typer til C-typer ved hjelp av ctypes-klasser: c_int, c_double, c_char_p, c_void_p og så videre.
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"Angi argtypes og restype
Angi alltid argtypes (parametertyper) og restype (returtype) for å unngå stille krasj som skyldes typemismatch.
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.0Sende pekere
Bruk ctypes.byref(var) eller ctypes.pointer(var) for å sende en peker 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
Definer C-strukturer ved å arve fra ctypes.Structure og liste opp _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.0Arrayer
Opprett C-arrayer 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 50Tilbakekall (funksjonspekere)
Bruk ctypes.CFUNCTYPE til å opprette en Python-funksjon som kan kalles fra C, slik at den kan sendes som et tilbakekall.
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 comparatorLaste inn Windows-DLL-er
På Windows bruker De ctypes.WinDLL for DLL-er som bruker stdcall-konvensjonen, for eksempel Windows API.
import ctypes # Windows only
kernel32 = ctypes.WinDLL("kernel32", use_last_error=True)
kernel32.GetTickCount.restype = ctypes.c_ulong
print(kernel32.GetTickCount())Feilhåndtering
Kontroller ctypes.get_last_error() (Windows), eller bruk try/except på Python-nivå for feil som returneres som spesielle verdier.
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
Kall OpenSSLs SHA256 direkte via ctypes uten noe Python-bindingsbibliotek.
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())Hurtigsjekk
Hvorfor bør De alltid angi argtypes og restype for en ctypes-funksjon?
Oppsummering
ctypes laster inn delte C-biblioteker uten kompilering. Angi argtypes og restype for hver funksjon. Bruk Structure for C-strukturer, TypeClass * N for arrayer og CFUNCTYPE for tilbakekall.
Lær deg Python med en AI-veileder – gratis
Skriv og kjør ekte kode i nettleseren, få umiddelbar hjelp fra en AI-veileder som er tilgjengelig døgnet rundt, og fortsett der du slapp – på nettet eller i appen.
- Kurs
- 76
- Leksjoner
- 320
Ofte stilte spørsmål
Er leksjonen «ctypes: Kalle C-biblioteker fra Python» gratis?
Ja – hele teksten i «ctypes: Kalle C-biblioteker fra Python» er gratis å lese her på nettet. For å øve interaktivt med en innebygd kodeeditor og en AI-veileder som er tilgjengelig døgnet rundt, og for å låse opp resten av Python Academy-kurset, kan du oppgradere til CoddyKit PRO. Kurset i Python Academy inneholder totalt 4 leksjoner.
Hva lærer jeg i «ctypes: Kalle C-biblioteker fra Python»?
Last inn delte biblioteker og kall C-funksjoner med ctypes. Du øver på Python Academy med praktisk kode som du kjører direkte i nettleseren, mens en AI-veileder som er tilgjengelig døgnet rundt, svarer på spørsmålene dine mens du jobber deg gjennom leksjonen.
Trenger jeg erfaring for å begynne med Python Academy?
Ingen tidligere erfaring er nødvendig. Python Academy på CoddyKit er lagt opp for både nybegynnere og viderekomne, så De kan begynne her eller helt fra start og lære i Deres eget tempo. Dette er leksjon 2 av 4.
Hvor lang tid tar leksjonen «ctypes: Kalle C-biblioteker fra Python»?
De fleste CoddyKit-leksjoner tar omtrent 5–10 minutter. Hver leksjon er kort og interaktiv, slik at De gjør jevne fremskritt og kan fortsette akkurat der De slapp – både på nettet og i appen.
Kan jeg skrive og kjøre kode i denne Python Academy-leksjonen?
Ja. Alle Python Academy-leksjoner har en innebygd kodeeditor, slik at De kan skrive og kjøre ekte kode direkte i nettleseren og få umiddelbar tilbakemelding fra AI – uten lokal konfigurering.
Alle leksjonene i dette kurset
- Hvorfor C-utvidelser? Bruksområder og avveininger
- ctypes: Kalle C-biblioteker fra Python
- cffi: C Foreign Function Interface
- Skrive en Python C-utvidelsesmodul