cffi: C Yabancı İşlev Arayüzü
Satır içi C bildirimleriyle daha Python'a özgü C birlikte çalışabilirliği için cffi kullanın.
cffi: C Yabancı İşlev Arayüzü, CoddyKit'te ücretsiz bir Python Academy dersidir. Bu, 4 dersinin 3. dersidir. Aşağıdan dersin tamamını ücretsiz okuyabilir, sonra tarayıcıda yerleşik kod editörü ve 7/24 yapay zeka koçu ile uygulamalı olarak pratik yapabilirsin. Bu, Python Academy öğrenme yolunun bir parçasıdır ve ilerlemeniz web ve CoddyKit uygulaması arasında senkronize olur. Python Academy kursu toplamda 4 dersten oluşur.
cffi Nedir?
cffi (C Yabancı İşlev Arayüzü), ctypes sınıfları yerine C bildirimlerini kullanarak C kodunu Python'dan çağırmanızı sağlar. Python'a daha uygundur ve çoğu zaman daha güvenlidir.
# pip install cffi
from cffi import FFI
ffi = FFI()
ffi.cdef("double sqrt(double x);")
libm = ffi.dlopen(None) # current process
print(libm.sqrt(2.0)) # 1.4142...ABI ve API Modu
ffi.dlopen() ABI modudur; çalışma zamanında mevcut bir paylaşılan kitaplığı çağırır. API modu bir C sarmalayıcısı derler ve daha hızlı, daha sağlamdır.
from cffi import FFI
ffi = FFI()
# ABI mode (no compile step):
ffi.cdef("int abs(int x);")
libc = ffi.dlopen("libc.so.6") # Linux
print(libc.abs(-42)) # 42cdef Bildirimleri
Python'dan kullanmak istediğiniz C işlev imzalarını, yapılarını ve typedef'lerini bildirmek için ffi.cdef() kullanın.
from cffi import FFI
ffi = FFI()
ffi.cdef("""
typedef struct {
double x;
double y;
} Point;
double distance(Point a, Point b);
""")
# lib = ffi.dlopen("mylib.so")C Yapıları Oluşturma
Bir C yapısı ayırmak ve alanlarını Python'dan ayarlamak için ffi.new() kullanın.
from cffi import FFI
ffi = FFI()
ffi.cdef("typedef struct { int x; int y; } Vec2;")
lib = ffi.dlopen(None)
v = ffi.new("Vec2 *")
v.x = 3
v.y = 4
print(v.x, v.y) # 3 4Dizeler ve Arabellekler
Değiştirilebilir arabellekler için ffi.new("char[]", n), bir C dizesi işaretçisini Python baytlarına dönüştürmek için ffi.string(ptr) kullanın.
from cffi import FFI
ffi = FFI()
buf = ffi.new("char[]", b"hello world")
print(ffi.string(buf)) # b"hello world"
# Mutable buffer for output:
out = ffi.new("char[128]")
# c_func(out, 128) # fill the buffer
# result = ffi.string(out).decode()verify ile API Modu
API modu, daha iyi tür güvenliği ve performans için küçük bir C sarmalayıcı modülü derler. ffi.set_source() kullanın ve çevrimdışı derleyin.
from cffi import FFI
ffi = FFI()
ffi.cdef("int add(int a, int b);")
ffi.set_source("_mylib",
"""
int add(int a, int b) { return a + b; }
"""
)
# Build: python build_mylib.py
# from _mylib import ffi, lib
# print(lib.add(3, 4)) # 7C'den Python'a Geri Çağırmalar
Bir Python işlevini C kitaplığına geçirilebilen bir C işlev işaretçisine sarmalamak için ffi.callback() kullanın.
from cffi import FFI
ffi = FFI()
ffi.cdef("typedef int (*compare_fn)(int, int);")
@ffi.callback("int(int, int)")
def compare(a, b):
return a - b
# pass compare to a C sort functionBellek Yönetimi
ffi.new() ile ayrılan nesnelerin sahibi Python'dır ve bu nesneler otomatik olarak serbest bırakılır. Özel bir yıkıcı işlev eklemek için ffi.gc(ptr, destructor) kullanın.
from cffi import FFI
ffi = FFI()
# ptr freed when Python GC collects it:
buf = ffi.new("int[10]")
buf[0] = 42
print(buf[0]) # 42
# Custom destructor:
# ptr = ffi.gc(lib.alloc(), lib.free)cffi ve ctypes
cffi, C bildirim dizelerini kullanırken (C geliştiricileri için daha doğaldır) ctypes Python sınıflarını kullanır. cffi'nin API modu daha hızlıdır; ctypes ise derleme gerektirmez.
# ctypes approach:
import ctypes
libc = ctypes.CDLL("libc.so.6")
libc.abs.restype = ctypes.c_int
libc.abs.argtypes = [ctypes.c_int]
print(libc.abs(-5)) # 5
# cffi approach:
from cffi import FFI; ffi = FFI()
ffi.cdef("int abs(int);")
lib = ffi.dlopen(None)
print(lib.abs(-5)) # 5cffi ile NumPy Kullanımı
NumPy dizi verilerini ffi.cast() ve dizinin ctypes.data işaretçisini kullanarak cffi üzerinden doğrudan C'ye geçirin.
import numpy as np
from cffi import FFI
ffi = FFI()
arr = np.array([1.0, 2.0, 3.0])
ptr = ffi.cast("double *", arr.ctypes.data)
# Now ptr can be passed to a C function expecting double*cffi ile Hata Yönetimi
C işlevleri genellikle hataları dönüş değerleri aracılığıyla bildirir. Dönüş değerlerini denetleyin ve POSIX hata kodları için ffi.errno kullanın.
import errno as errno_mod
from cffi import FFI
ffi = FFI()
ffi.cdef("int open(const char *path, int flags);")
lib = ffi.dlopen(None)
fd = lib.open(b"/nonexistent", 0)
if fd == -1:
err = ffi.errno
raise OSError(err, "open failed")Hızlı Kontrol
cffi, çağırmak istediğiniz C işlev imzalarını bildirmek için hangi yöntemi kullanır?
Özet
cffi, C imzalarını bildirmek için ffi.cdef(), ABI modunda kitaplık çağrıları yapmak için ffi.dlopen() kullanır. API modu, daha iyi performans için bir sarmalayıcı derler. C belleği için ffi.new(), Python'dan C'ye geri çağırmalar için ffi.callback() kullanın.
Sıkça Sorulan Sorular
“cffi: C Yabancı İşlev Arayüzü” dersi ücretsiz mi?
Evet — “cffi: C Yabancı İşlev Arayüzü” dersin tüm metni burada web'de ücretsiz olarak okunabilir. Etkileşimli olarak pratik yapmak (yerleşik kod editörü ve 7/24 yapay zeka koçu) ve Python Academy kursunun geri kalanını açmak için CoddyKit PRO'ya yükselt. Python Academy kursu toplamda 4 dersten oluşur.
“cffi: C Yabancı İşlev Arayüzü” dersinde ne öğreneceğim?
Satır içi C bildirimleriyle daha Python'a özgü C birlikte çalışabilirliği için cffi kullanın. Python Academy ile uygulamalı kodu tarayıcıda doğrudan çalıştırarak pratik yaparsın ve 7/24 yapay zeka koçu dersi çalışırken sorularını yanıtlar.
Python Academy öğrenmeye başlamak için deneyim gerekli mi?
Önceden deneyim gerekmez. CoddyKit'te Python Academy, başlangıçtan ileri seviyeye kadar yapılandırıldığı için buradan başlayabilir veya başından başlayıp kendi hızında ilerleme yapabilirsin. Bu, 4 dersinin 3. dersidir.
“cffi: C Yabancı İşlev Arayüzü” dersi ne kadar sürer?
Çoğu CoddyKit dersi yaklaşık 5–10 dakika sürer. Her biri kısa ve etkileşimli olduğu için sabit ilerleme yaparsın ve web ile uygulama arasında tam olarak bıraktığın yerden devam edebilirsin.
Bu Python Academy dersinde kod yazıp çalıştırabilir miyim?
Evet. Her Python Academy dersi yerleşik bir kod editörü içerir, bu sayede tarayıcıda gerçek kod yazıp çalıştırabilir ve anlık yapay zeka geri bildirimi alırsın — yerel kurulum gerekli değildir.
Bu kursun tüm dersleri
- C Uzantıları Neden Kullanılır? Kullanım Alanları ve Ödünleşimler
- ctypes: Python'dan C Kitaplıklarını Çağırma
- cffi: C Yabancı İşlev Arayüzü
- Python C Uzantısı Modülü Yazma