Python Academy · leksjon

ctypes: Kalle C-biblioteker fra Python

Last inn delte biblioteker og kall C-funksjoner med ctypes.

Leksjon 2 av 413 trinn

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

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

Arrayer

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 50

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

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

Gratis å komme i gang

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

  1. Hvorfor C-utvidelser? Bruksområder og avveininger
  2. ctypes: Kalle C-biblioteker fra Python
  3. cffi: C Foreign Function Interface
  4. Skrive en Python C-utvidelsesmodul
← Tilbake til Python Academy