Python Academy · Lektion

ctypes: Kald af C-biblioteker fra Python

Indlæs delte biblioteker, og kald C-funktioner med ctypes.

Lektion 2 af 413 trin

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

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

Arrays

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 50

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

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

Gratis at komme i gang

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

  1. Hvorfor C-udvidelser? Anvendelser og afvejninger
  2. ctypes: Kald af C-biblioteker fra Python
  3. cffi: C Foreign Function Interface
  4. Skrivning af et Python-C-udvidelsesmodul
← Tilbage til Python Academy