Python Academy · Lektion

ctypes: anropa C-bibliotek från Python

Läs in delade bibliotek och anropa C-funktioner med ctypes.

Lektion 2 av 413 steg

ctypes: anropa C-bibliotek från Python är en gratis lektion i Python Academy på CoddyKit. Detta är lektion 2 av 4. Ni kan läsa hela lektionen gratis nedan och sedan öva praktiskt i webbläsaren med en inbyggd kodredigerare och en AI-handledare som är tillgänglig dygnet runt. Den ingår i lärvägen för Python Academy, och Era framsteg synkroniseras mellan webben och CoddyKit-appen. Kursen i Python Academy innehåller totalt 4 lektioner.

Vad är ctypes?

ctypes är en standardbiblioteksmodul för att läsa in delade C-bibliotek och anropa deras funktioner från Python – ingen kompilering krävs.

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!")

Läsa in bibliotek

Använd ctypes.CDLL för anropskonventionen cdecl (de flesta C-bibliotek) och WinDLL för 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

Mappa Python-typer till C-typer med ctypes-klasser: c_int, c_double, c_char_p, c_void_p med flera.

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"

Ange argtypes och restype

Ange alltid argtypes (parametertyper) och restype (returtyp) för att undvika tysta krascher på grund av typfel.

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

Skicka pekare

Använd ctypes.byref(var) eller ctypes.pointer(var) för att skicka en pekare till 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)

Structar

Definiera C-structar genom att ärva från ctypes.Structure och ange _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

Matriser

Skapa C-matriser 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

Callback-funktioner (funktionspekare)

Använd ctypes.CFUNCTYPE för att skapa en Python-funktion som kan anropas från C och skickas som en callback.

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

Läsa in Windows-DLL:er

I Windows använder ni ctypes.WinDLL för DLL:er som använder stdcall-konventionen, till exempel Windows API.

import ctypes   # Windows only

kernel32 = ctypes.WinDLL("kernel32", use_last_error=True)
kernel32.GetTickCount.restype = ctypes.c_ulong
print(kernel32.GetTickCount())

Felhantering

Kontrollera ctypes.get_last_error() (Windows) eller använd try/except på Python-nivå för fel som returneras som särskilda värden.

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()))

Praktiskt exempel: SHA-256 med OpenSSL

Anropa OpenSSL:s SHA256 direkt via ctypes utan något 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())

Snabbkontroll

Varför bör ni alltid ange argtypes och restype för en ctypes-funktion?

Sammanfattning

ctypes läser in delade C-bibliotek utan kompilering. Ange argtypes och restype för varje funktion. Använd Structure för C-structar, TypeClass * N för matriser och CFUNCTYPE för callback-funktioner.

Gratis att börja

Lär dig Python med en AI-lärare – gratis

Skriv och kör riktig kod i webbläsaren, få omedelbar hjälp av en AI-lärare dygnet runt och fortsätt där du slutade – på webben eller i appen.

Kurser
76
Lektioner
320

Vanliga frågor

Är lektionen ”ctypes: anropa C-bibliotek från Python” gratis?

Ja – hela texten till ”ctypes: anropa C-bibliotek från Python” kan läsas gratis här på webben. Om Ni vill öva interaktivt med en inbyggd kodredigerare och en AI-handledare som är tillgänglig dygnet runt och låsa upp resten av kursen i Python Academy, kan Ni uppgradera till CoddyKit PRO. Kursen i Python Academy innehåller totalt 4 lektioner.

Vad lär jag mig i ”ctypes: anropa C-bibliotek från Python”?

Läs in delade bibliotek och anropa C-funktioner med ctypes. Ni övar på Python Academy med praktisk kod som körs direkt i webbläsaren, medan en AI-handledare som är tillgänglig dygnet runt svarar på Era frågor under lektionen.

Behöver jag någon erfarenhet för att börja lära mig Python Academy?

Du behöver inga förkunskaper. Utbildningen i Python Academy på CoddyKit är upplagd för allt från nybörjare till avancerade elever, så att du kan börja här eller från början och gå fram i din egen takt. Detta är lektion 2 av 4.

Hur lång tid tar lektionen ”ctypes: anropa C-bibliotek från Python”?

De flesta CoddyKit-lektioner tar cirka 5–10 minuter. Varje lektion är kort och interaktiv, så att du gör stadiga framsteg och kan fortsätta precis där du slutade – på webben eller i appen.

Kan jag skriva och köra kod i den här Python Academy-lektionen?

Ja. Varje Python Academy-lektion innehåller en inbyggd kodredigerare, så att du kan skriva och köra riktig kod direkt i webbläsaren och få omedelbar AI-feedback – utan lokal installation.

Alla lektioner i den här kursen

  1. Varför C-tillägg? Användningsområden och avvägningar
  2. ctypes: anropa C-bibliotek från Python
  3. cffi: C Foreign Function Interface
  4. Skriva en Python C Extension-modul
← Tillbaka till Python Academy