Golang Fonksiyonlarını Python’da Kullanmak

Golang Fonksiyonlarını Python'da Kullanmak

Selamlar. Bu yazıda go programlama dilinde oluşturduğumuz fonksiyonların nasıl shared object olarak export edileceğini ve Python ile kullanılacağını anlatacağım. (Görselleri hazırlarken Açık kaynak kodlu, özgür GIMP yazılımını kullanıyorum.)

Aslında bu yazı meraktan ibaret. Yani ne gibi bir paket geliştiriyorsunuz ki bunun Python’da bulunma zorunluluğu var ve dahası bu Python ile yapılamıyor. Neyse atomu parçalayan bir fonksiyon yazdığımızı varsayarak yola koyulalım. Adım adım gidelim ve öncelikle Go tarafında fonksiyonlarımızı oluşturalım.

Golang Fonksiyonların Oluşturulması

Yazıda geçecek örnek geometrik şekillerin hacmini hesaplayan bazı fonksiyonları içerecek. (Hepsini Python tarafına aktaracağımız için tek tek yazalım)

Şimdi isterseniz modellemesi gerçekleşen bu metodları dolduralım. Öncelikle küpün hacmini veren metodla başlayalım. Bildiğiniz gibi küpün hacmi V=k^3 ile hesaplanır. Gerçeklemesini yapalım:

Ardından dikdörtgenler prizmasının hacmini hesaplatalım. Bildiğinizi varsayarak a.b.c olduğunu belirtiyorum.

Sıra geldi kürenin hacminin hesaplanmasına. Okul günlerine geri dönerek 4/3πr^3 olduğunu hatırlıyoruz. Bütün geometrik şekilleri yazmayacağım bu arada gereksiz. Şimdi bu son metodumuzu da yazalım.

Artık metodlarımız hazır. Şimdi bu metodları C shared object olarak göstermemiz için C paketini import edip, metodların başına yorum satırlarıyla dışarı aktarılabilir olduklarını belirtmemiz gerekmekte. Örnek:

Shared object yaratacak olsak bile main metodunun entry point olarak tanımlanması gerekiyor. Bir metodun export edilip edilemeyeceğine, metodun başında yer alan yorum satırları ile karar veriyoruz. Bu yorum satırında yer alan metod adı ayrıca Python tarafında çağırılacaktır.

İşlemlerimizi tamamladığımıza göre şu komutu konsoldan çalıştıralım:

Bu komut kodları yazdığımız dosyadan (bende main.go) shared object dosyası oluşturmamıza yardımcı olacak. Bu işlemin ardından geometri.h ve geometri.so adında iki dosyanın oluşacak. İlgileniyorsanız C header file’a göz atabilirsiniz.

Python’a Shared Object Dosyasını Çağıralım

İşin golang tarafı bittiğine göre Python’a bu fonksiyonların nasıl aktarılacağı kalıyor. Öncelikle bilmiyorsanız söyleyeyim ctypes modülünü kullanacağız.

https://docs.python.org/3.6/library/ctypes.html adresinden modül hakkında bilgi alabilirsiniz.

Henüz Python kodlarını yazmaya başlamadan önce dilerseniz nm komutu yardımıyla object dosyasında oluşturduğumuz fonksiyonlar var mı kontrol edebiliriz. Bu arada bir fonksiyon bir metod diyorum özür dilerim bunun için. Ne diyorduk nm komutu şöyle bir komut ve çıktısı bizi beklemekte:

Demek ki bu object file, oluşturduğumuz fonksiyonları içeriyor. O halde artık kodlamaya geçelim:

Görüldüğü gibi ctypes import edildi. Ardından LoadLibrary ile shared object dosyamızı referans olarak belirtiyoruz. Oluşturduğumuz lib dosyası artık geometri kütüphanesinin tüm olanaklarını yüklenmiş durumda.

argtypes: Go tarafında oluşturulan fonksiyonun, alacağı parametreler, tür karşılıklarıyla birlikte dizi türünden burada tanımlanır.

restype: Oluşturulan fonksiyon eğer tür dönüyorsa ctypes modülünde yer alan tür karşılığı belirtilir.

Her metod argstype ve restype özelliklerine sahip oluyor diyebiliriz.

Küp Metodu

Metod adı go dilinde oluşturduğumuz haliyle burada yer alacak ancak bazı önemli noktalar var. Örneğin bu metodun alacağı argüman türlerini belirtmemiz gerekiyor. Örneğin bu metod 5 parametre alsaydık tek tek burada da belirtmeliydik.

Python’da, Go dilinde bulunan float64 türü yok. Bu nedenden dolayı ctypes modülünde yer alan c_double tür dönüşümünü kullanıyoruz. Ayrıca go tarafında oluşturulan fonksiyonun dönüş türünü de belirtebiliyoruz.

Dikdörtgenler Prizması

Yukarıda yer alan argstype ve restype olayının en iyi kavranacağı nokta burası aslında.

Küre

Artık bu kısmı anlatmaya gerek duymuyorum. Sonuç olarak nasıl kullanılacağını görmüş olduk.

Bu yazı bu kadar. Bu yazıda Go programlama dili ile oluşturulan shared object yani *.so dosyalarının Python’da nasıl kullanılacağını gördük.

Okuduğunuz için teşekkür ederim. İyi çalışmalar dilerim.

admin

Hi. I’m Ali. I’m 23. I graduated Mehmet Akif Ersoy University from CS Related Department.

I can code with all programming languages. But today I’m writing .NET and JavaScript.

You may also like...