Python ctypes Notlarım – 6

Alan adının ödeme gününü kaçırınca bayağı bir boşluk oldu, haliyle yazılarıma / notlarıma düzgünce devam edemedim. Bu durum için kusura bakmayın. Artık Python ctypes modülünün notlarına yavaşça veda etmeye başladık diyebilirim, sonlara yaklaştık çünkü.

Önceki dersimizde, python ctypes ile pointer kullanımının detaylarına inmiş, tür dönüşümlerini incelemiştik ve bir kaç tadından yenmez fonksiyonu sizlerle paylaşmıştım.

Daha önceleri notlarım / derslerimde  C ile kütüphaneler (.dll / .so) oluşturup içlerinde bulunan fonksiyonlara ulaşmıştık. Bu derste o fonksiyonlara daha detaylı bir şekilde nasıl erişiriz onlara değineceğiz.

Ctypes Wrapper

Öncelikli basit bir çarpma işlemi yapan carpma_islemi adında C’de bir fonksiyon oluşturalım, hemen ardından işletim sistemimize göre bunu derleyelim. (Python ctypes Notlarım -1 konusunda nasıl derleneceği hakkında yardım alabilirsiniz)

C

Python

C’den Python’a fonksiyonların geçişinde, Python’da C’ye ait söz dizim kuralları olmadığından; fonksiyonumuzun öncelikle parametrelerinin türlerini ctypes.fonksiyon_ismi.argtypes niteliğiyle yapıp ardından geri dönüş türünü de ctypes.fonksiyon_ismi.restype niteliği ile yarak gerekli işlemleri ctypes kurallarına göre gerçekleştirmek gerekir. argtypes niteliğinin değer kümesi demet veya liste (tuple / list) olması gerekirken restype için böyle bir şey söylenemez, restype‘ın alacağı değer mecburen ctypes değişkenleri veya sizin ctypes kullanarak oluşturduğunuz değişken türlerinden olabilir. Aynı durum argtypes için de geçerlidir.

Yukarıdaki örnek kod da neler yaptık şöyle kısaca bir özetleyelim; ctypes modülümüzü çağırarak, C ile oluşturmuş olduğumuz libcarpma.so kütüphanesini Python’da _carpma değişkeninde depoladık. Ardından fonksiyonumuza depolamış olduğumuz _carpma değişkeninden erişerek argtypes niteliğini belirttik. Ctypes notlarım 4 ve 5 de pointer kavramına detaylıca değinmiştik yine de üzerinden geçelim, ctypes.POINTER(ctypes.c_int) ile int* ifadesine eşit bir durum oluşturmuş olduk. array_type(*numbers) satırında, array_type bir parametre olarak her dizi öğesini bekliyor, bu yüzden * koyarak kullanıyoruz.

Son halini kullanırsak;

Callback Functions

ctypes çalışma sırasında platforma bağlı (platform-dependent) fonksiyonları kimin çağırdığı takip eden bir kütüphane kullanır. Bu sayede C üzerinden Python’a fonksiyon çağırımını mümkün kılar. Olayları içeren API ile ilgili aramalar C olarak Python fonksiyonlarını kullanmak için bize izin verir. Örneğin bir GUI kütüphanesi (mesela, gtk, qt gibi). Ve bu durum bize harika derecede yardımcı olur.

Bunu yapabilmek için, ctypes.CFUNCTYPE fonksiyonunu kullarak bir tür oluşturmak gerekir. Aşağıdaki örneğin C dilindeki karşılığına C sekmesinden bakabilirsiniz.

Python

C

Python fonksiyonu ile bir örnek yapalım;

callback_func fonksiyonu normal C fonksiyonu argümanı olarak kullanılabilir. Eğer garbage collector tarafından silinmiş ise C dilinde çağrılır veya makina dilinde segfault a neden olabilir ya da rasgele bellek yorumlayabilir.

 

Leave a Reply

Your email address will not be published. Required fields are marked *