0Pricing
Python Academy · Lekcja

ctypes: wywoływanie bibliotek C z Pythona

Proszę ładować biblioteki współdzielone i wywoływać funkcje C za pomocą ctypes.

ctypes: wywoływanie bibliotek C z Pythona to bezpłatna lekcja Python Academy na CoddyKit. To lekcja 2 z 4. Możesz przeczytać całą lekcję poniżej za darmo — a potem ćwiczyć ją interaktywnie w przeglądarce z wbudowanym edytorem kodu i tutorem AI dostępnym 24/7. To część ścieżki edukacyjnej Python Academy, a Twój postęp synchronizuje się między webem a aplikacją CoddyKit. Kurs Python Academy zawiera 4 lekcji w sumie.

Czym jest ctypes?

ctypes to moduł biblioteki standardowej służący do ładowania współdzielonych bibliotek C i wywoływania ich funkcji z poziomu Pythona — bez konieczności kompilacji.

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

Ładowanie bibliotek

Proszę używać ctypes.CDLL w przypadku konwencji wywołań cdecl (większość bibliotek C) oraz WinDLL w przypadku interfejsów Windows korzystających ze 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...

Typy danych C

Typy Pythona można mapować na typy C za pomocą klas ctypes: c_int, c_double, c_char_p, c_void_p itd.

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"

Ustawianie argtypes i restype

Zawsze należy deklarować argtypes (typy parametrów) i restype (typ zwracany), aby uniknąć trudnych do wykrycia awarii spowodowanych niezgodnością typów.

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

Przekazywanie wskaźników

Proszę użyć ctypes.byref(var) lub ctypes.pointer(var), aby przekazać wskaźnik do zmiennej C.

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)

Struktury

Struktury C należy definiować przez dziedziczenie po ctypes.Structure i podanie listy _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

Tablice

Tablice C można tworzyć za pomocą 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

Callbacki (wskaźniki do funkcji)

Proszę użyć ctypes.CFUNCTYPE, aby utworzyć funkcję Pythona wywoływalną z C i przekazać ją jako 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

Ładowanie bibliotek DLL systemu Windows

W systemie Windows proszę używać ctypes.WinDLL w przypadku bibliotek DLL korzystających z konwencji stdcall, na przykład interfejsu Windows API.

import ctypes   # Windows only

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

Obsługa błędów

Proszę sprawdzać ctypes.get_last_error() (Windows) lub używać obsługi wyjątków try/except na poziomie Pythona w przypadku błędów zwracanych jako wartości specjalne.

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

Praktyczny przykład: SHA-256 z OpenSSL

Proszę wywołać bezpośrednio funkcję SHA256 biblioteki OpenSSL za pomocą ctypes, bez korzystania z biblioteki bindingów Pythona.

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

Szybkie sprawdzenie

Dlaczego zawsze należy ustawiać argtypes i restype dla funkcji ctypes?

Podsumowanie

ctypes ładuje współdzielone biblioteki C bez kompilacji. Dla każdej funkcji należy zadeklarować argtypes i restype. Proszę używać Structure dla struktur C, TypeClass * N dla tablic oraz CFUNCTYPE dla callbacków.

Często zadawane pytania

Czy lekcja „ctypes: wywoływanie bibliotek C z Pythona” jest bezpłatna?

Tak — pełny tekst „ctypes: wywoływanie bibliotek C z Pythona” jest dostępny za darmo tutaj w sieci. Aby ćwiczyć ją interaktywnie (wbudowany edytor kodu i tutor AI dostępny 24/7) i odblokować resztę kursu Python Academy, przejdź na CoddyKit PRO. Kurs Python Academy zawiera 4 lekcji w sumie.

Co nauczysz się w „ctypes: wywoływanie bibliotek C z Pythona”?

Proszę ładować biblioteki współdzielone i wywoływać funkcje C za pomocą ctypes. Ćwiczysz Python Academy z praktycznym kodem, który uruchamiasz bezpośrednio w przeglądarce, a tutor AI dostępny 24/7 odpowiada na Twoje pytania podczas pracy nad lekcją.

Czy potrzebuję doświadczenia, aby zacząć Python Academy?

Nie wymagamy żadnego doświadczenia. Python Academy w CoddyKit jest strukturyzowany dla początkujących i zaawansowanych użytkowników, więc możesz zacząć tutaj lub od początku i uczyć się w swoim tempie. To lekcja 2 z 4.

Ile czasu zajmuje lekcja „ctypes: wywoływanie bibliotek C z Pythona”?

Większość lekcji CoddyKit trwa około 5–10 minut. Każda lekcja to mały, interaktywny krok, dzięki czemu robisz systematyczne postępy i zawsze wracasz dokładnie do tego samego miejsca — na webie i w aplikacji.

Czy mogę pisać i uruchamiać kod w tej lekcji Python Academy?

Tak. Każda lekcja Python Academy zawiera wbudowany edytor kodu, więc piszesz i uruchamiasz prawdziwy kod bezpośrednio w przeglądarce i od razu otrzymujesz sprzężenie zwrotne od AI — bez konfiguracji na komputerze.

Wszystkie lekcje w tym kursie

  1. Po co rozszerzenia C? Zastosowania i kompromisy
  2. ctypes: wywoływanie bibliotek C z Pythona
  3. cffi: interfejs funkcji zewnętrznych C
  4. Pisanie modułu rozszerzeń C dla Pythona
← Powrót do Python Academy