CodeBlanks Logo Icon CodeBlanks

ctypes

ctypes ile yerel kod çağrısı yazarsın.

Yerel kod katmanı

Bu derste ctypes ile C kütüphanesinden abs fonksiyonunu çağırma ekleyeceksin. ctypes.CDLL(None) varsayılan C kütüphanesini yükler.

libc.abs(-7) çağrısı negatif sayının mutlak değerini verir. Önceki derslerin kodu başlangıçta hazır. Sen yalnızca import ctypes, CDLL(None) ve abs çağrısını eklersin. Bu katman, son derste paralel işleme ile birleştirilecek.

Uygulama ctypes ile abs çağır

Başlangıç kodunda Tool, Field, ModelMeta ve square hazır. Şimdi import ctypes ile modülü içe aktar. libc = ctypes.CDLL(None) ile kütüphaneyi yükle. print(libc.abs(-7)) ile mutlak değeri yazdır.

Başlangıç kodu

main.py
# Tool sınıfını type() ile oluştur
Tool = type("Tool", (), {
    "name": "arac",
    "run": lambda self: f"{self.name} calisti",
})

# Field descriptor ve ModelMeta ekle
class Field:
    def __set_name__(self, owner, name):
        self.name = name
        if not hasattr(owner, "fields"):
            owner.fields = []
        owner.fields.append(name)

class ModelMeta(type):
    def __new__(mcs, name, bases, ns):
        return super().__new__(mcs, name, bases, ns)

class Model(metaclass=ModelMeta):
    ad = Field()

# Paralel kare hesaplama ekle
from multiprocessing import Pool

def square(x):
    return x * x

# Yerel abs çağrısı ekle
# libc yükle ve abs çağır
# sonucu yazdır

Örnek çözüm

main.py
# Tool sınıfını type() ile oluştur
Tool = type("Tool", (), {
    "name": "arac",
    "run": lambda self: f"{self.name} calisti",
})

# Field descriptor ve ModelMeta ekle
class Field:
    def __set_name__(self, owner, name):
        self.name = name
        if not hasattr(owner, "fields"):
            owner.fields = []
        owner.fields.append(name)

class ModelMeta(type):
    def __new__(mcs, name, bases, ns):
        return super().__new__(mcs, name, bases, ns)

class Model(metaclass=ModelMeta):
    ad = Field()

# Paralel kare hesaplama ekle
from multiprocessing import Pool

def square(x):
    return x * x

# Yerel abs çağrısı ekle
import ctypes

libc = ctypes.CDLL(None)

print(libc.abs(-7))

Beklenen çıktı

7

Sıradaki adım: birleştirme

ctypes katmanı hazır. Son derste tüm katmanları birleştireceksin: abs_val fonksiyonu hem libc.abs çağırır hem de Pool.map ile paralel çalışır.

Bu, metaprogramming, multiprocessing ve ctypes'ı tek bir uygulamada birleştirir. Şimdiye kadar dört katman hazır: Tool, Field/ModelMeta, Pool ve ctypes. Tüm bu teknikler birlikte çalışacak.

Soru ve cevaplar

Dersin sorularını cevaplarıyla birlikte inceleyebilirsin. Kendini denemek istersen dersi interaktif olarak çöz.

1 CDLL ne yükler?

main.py
import ctypes
libc = ctypes.CDLL(None)
  • Bir Python modülü
  • Bir web sayfası
  • Paylaşımlı C kütüphanesi Doğru cevap
  • Bir dizi

Açıklama: CDLL paylaşılan bir C kütüphanesi yükler.

2 ctypes kavramlarını eşleştir

Kavram Anlamı
ctypes C arayüzü
CDLL Kütüphane yükler
libc Kütüphane nesnesi
.abs Fonksiyon çağrısı

3 CDLL çağrısını tamamla

Soru
import ctypes
libc = ctypes.____(None)
Cevap
import ctypes
libc = ctypes.CDLL(None)

Açıklama: ctypes.CDLL(None) varsayılan C kütüphanesini yükler.

Uzman bölümündeki tüm dersler