ctypes: Python'dan C Kitaplıklarını Çağırma
Paylaşılan kitaplıkları yükleyin ve ctypes kullanarak C işlevlerini çağırın.
ctypes: Python'dan C Kitaplıklarını Çağırma, CoddyKit'te ücretsiz bir Python Academy dersidir. Bu, 4 dersinin 2. 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.
ctypes Nedir?
ctypes, paylaşılan C kitaplıklarını yüklemeye ve işlevlerini Python'dan çağırmaya yarayan, derleme gerektirmeyen bir standart kitaplık modülüdür.
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!")Kitaplıkları Yükleme
cdecl çağrı kuralı için (çoğu C kitaplığında) ctypes.CDLL, Windows stdcall API'leri için ise WinDLL kullanın.
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 Veri Türleri
Python türlerini ctypes sınıflarını kullanarak C türleriyle eşleyin: c_int, c_double, c_char_p, c_void_p vb.
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"argtypes ve restype Ayarlama
Tür uyuşmazlıklarının neden olabileceği sessiz çökmeleri önlemek için her zaman argtypes (parametre türleri) ve restype (dönüş türü) bildirin.
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İşaretçi Geçirme
Bir C değişkenine işaretçi geçirmek için ctypes.byref(var) veya ctypes.pointer(var) kullanın.
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)Yapılar
ctypes.Structure sınıfından türeterek ve _fields_ listesini oluşturarak C yapılarını tanımlayın.
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.0Diziler
TypeClass * N ile C dizileri oluşturun.
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 50Geri Çağırmalar (İşlev İşaretçileri)
Geri çağırma olarak geçirmek üzere C tarafından çağrılabilen bir Python işlevi oluşturmak için ctypes.CFUNCTYPE kullanın.
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 comparatorWindows DLL'lerini Yükleme
Windows'ta stdcall kuralını kullanan DLL'ler için (ör. Windows API'si) ctypes.WinDLL kullanın.
import ctypes # Windows only
kernel32 = ctypes.WinDLL("kernel32", use_last_error=True)
kernel32.GetTickCount.restype = ctypes.c_ulong
print(kernel32.GetTickCount())Hata Yönetimi
ctypes.get_last_error() değerini (Windows) denetleyin veya özel değerler olarak döndürülen hatalar için Python düzeyinde try/except kullanın.
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()))Uygulamalı Örnek: OpenSSL ile SHA-256
Herhangi bir Python bağlayıcı kitaplığı kullanmadan, ctypes aracılığıyla OpenSSL'in SHA256 işlevini doğrudan çağırın.
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())Hızlı Kontrol
Bir ctypes işlevinde argtypes ve restype değerlerini neden her zaman ayarlamalısınız?
Özet
ctypes, paylaşılan C kitaplıklarını derleme yapmadan yükler. Her işlev için argtypes ve restype bildirin. C yapılarını tanımlamak için Structure, diziler için TypeClass * N ve geri çağırmalar için CFUNCTYPE kullanın.
Sıkça Sorulan Sorular
“ctypes: Python'dan C Kitaplıklarını Çağırma” dersi ücretsiz mi?
Evet — “ctypes: Python'dan C Kitaplıklarını Çağırma” 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.
“ctypes: Python'dan C Kitaplıklarını Çağırma” dersinde ne öğreneceğim?
Paylaşılan kitaplıkları yükleyin ve ctypes kullanarak C işlevlerini çağırı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 2. dersidir.
“ctypes: Python'dan C Kitaplıklarını Çağırma” 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