Swift - Python Birlikte Çalışma

Umut Boz
KoçSistem
Published in
6 min readApr 28, 2022

Swift programlama dilinin performans başarısı ve Python dilinin geniş ve yaygın kullanılan kütüphaneleri bir araya gelse ne olur? Bu çalışmada Swift programlama dilinden Python API’leri ile nasıl iletişim sağlanabildiğine ve Swift kodları içerisinden Python ile geliştirilmiş olan ya da geliştirdiğiniz kodları nasıl çalıştırabileceğinize dair örnekleri ve içerikleri bulabilirsiniz.

Swift

Swift, son yıllarda çok fazla tercih edilen ve kullanılan açık kaynaklı olan büyüyen bir programlama dilidir. Ana kullanıcı kitlesi mobil geliştiriciler olsa da server, api web teknolojilerinin geliştirilmesinde de tercih edilmektedir.

Anlaşılır söz dizimi(syntax) sayesinde anlaşılır ve kolay öğrenilebilir C ailesine ait bir programlama dilidir.

Hepsinden önemlisi low-level programlama dillerinde aşina olduğumuz yüksek düzeyde işlem performansına ve verimli memory kullanımı Swift programlama dilinde yine ön plana çıkmaktadır.

Comparison of programming languages

Grafikte The Computer Language Benchmarks Game tarafından gerçekleştirilen popüler programlama dilleri arasında belirli segmentlerde ve basit algoritma yöntemleri gerçekleştirilen performans testlerinin karşılaştırma sonuçlarını gözlemleyebiliriz.

Mor bar ile gösterilen 1. kategoride bulunan programlama dilleri hemen hemen herkes tarafından optimizasyon ve performans bakımından kabul görmüş yazılım dilleridir. Swift programlama dilinin kolay ve anlaşılır yapısının yanı sıra performans faydaları bir çok kütüphane ve platform geliştiricileri tarafından dikkat çekmesine neden olmuştur.

Swift DynamicMemberLookUp

Swift Type Safety yapıya sahip bir programlama dilidir. SE-0195 DynamicMemberLookUp geliştirmesiyle birlikte Script ya da komut dizini dilleri yapısına yaklaşmıştır. Bu özellik aynı zamanda Type Safety olarak gerçekleştirilmiş olur. Bu da PHP, Python gibi programlama dillerinde olan dinamik member özelliğine imkanı sağlamaktadır.

Aynı zamanda bu özellikle birlikte Dinamik Programlama dillerine iletişim sağlama ve birlikte çalışma(Interoperability) yapabilmenin önü açılmış oldu.

Python

Son zamanlarda Veri Bilimi dendiğinde akla ilk gelen programlama dilidir ve hatta ilk şeydir Python. Veri Bilimi dünyası için Python, sahip olduğu sayısız kütüphane ve çözümlerle tartışmasız lider konumdadır.

Python üzerinde çalıştığı veri boyutu arttıkça performans düşüşü, sınırlı eş zamanlı çalışma problemleri, deployment ve özelleştirilmiş donanım çözümleri, büyük projelerde dinamik tiplerin karmaşıklığı arttırması, proje büyüdükçe soyutlama ihtiyacının artması gibi sorunlarla karşılaşılmaktadır. Bu nedenle Google TensorFlow ekibi kütüphanenin gelişimi, yaygınlaşması ve ek çözümler üretebilme adına arayışa girmiştir. Bu bir hassas konu için yapılan değerlendirmeler genel geçer ve bilimsel verilere dayanmak zorundadır.

Bu nedenle ya yeni bir programlama dili meydana getirilecek ya da mevcut programlama dilleri arasından değerlendirmeler, karşılaştırmalar yapılarak bir seçim yapılacak. Bu sürecin detaylarına, hangi parametrelere bağlı olduğuna, nasıl geliştiğine ve ilerlediğine dair çıktılar için Why Swift For TensorFlow çalışmasını inceleyebilirsiniz.

Swift — Python Birlikte Çalışma (Interoperability)

Google TensorFlow ekibi Why Swift For TensorFlow çalışmasıyla birlikte tercihini Swift Programlama Dilinden yana yapmış oldu. Google, Derin Öğrenmenin geleceği için planları doğrultusunda Swift’e yatırım yapıyor. Bu kapsamda bazı kütüphaneler Swift ile geliştiriliyor. Öte yandan Swift — Python Interoperability sayesinde Python API’larını Swift dilinde doğrudan kullanılabildiğinden önceden geliştirilmiş olan Python tecrübesi sürece dahil edilmiş oldu.

Swift için PythonKit’i kütüphanesini kullanarak python kodunu Swift’den çalıştırabilirsiniz.

Bu sayede Python çözümleri için, MacOS ve Linux ortamlarında çalışabilecek, Storyboard ya da SwiftUI gibi UI kütüphanelerini kullanarak Swift ile geliştirebileceğiniz arayüzler geliştirilebilir.

PythonKit

🦩 En eğlenceli kısım olan geliştirme aşamasına geçelim 🔥

Çalışma Ortamı

MacOs Monterey 12.2

Xcode 13.1

Python 2.7.4

Python 3.9.12

MacOs App

Xcode üzerinden bir MacOS uygulaması yazmak için ilk olarak aşağıdaki görselle işleme başlayalım.

Swift Package Manager üzerinden projemize PythonKit kütüphanemizi dahil ediyoruz.

https://github.com/pvieito/PythonKit

yukarıdaki repo’nun github bağlantısını aşağıdaki gibi eklemeniz yeterli olacaktır.

Swift Package Manager — PythonKit

Not: Bu makaleyi kaleme almadan önce gerçekleştirdiğim uygulama 0.2.3 versiyonuydu, 0.3.0 olarak yeni bir versiyon gelmiş durumda. Yapmış olduğum uygulamada herhangi versiyon uyumsuzluğu görülmemiştir. 27.04. 2022

Paket ekleme işlemi sonrası yapmanız gereken PyhtonKit’i import etmek.

import PythonKit

MacOS işletim sisteminde yapılandırdığım 2 farklı Python environment’ı bulunmaktadır.

Geliştirdiğiniz uygulamanızda hangi Python sürümü ile complier işlemini yapacaksanız tanımlamayı aşağıdaki gibi kod öncesinde çalıştırmanız yeterli.

PythonLibrary.useVersion(2, 7) // Python 2.7.18
//PythonLibrary.useVersion(3, 9) //Python 3.9.12

Kullanmış olacağınız Python API’leri dahil edildiği sürüm ve ortam üzerinde çalışabilir olur bu yüzden aşağıdaki gibi bir versiyon doğrulama işlemi dahil edebilirsiniz.

func isPyhton3() -> Bool{guard let pyVersion = String(Python.version)  else {return false}if (pyVersion.starts(with: "3")){return true}else{return false}}

Böylelikle Sadece Python3 env. ortamında olan paketinizi çağırdığınıza kodunuzun hata almayacağından emin olursunuz.

if self.isPyhton3(){//python 3let np = Python.import("numpy")print(np)let zeros = np.ones([2, 3])print(zeros)}

Yukarıda görüldüğü gibi numpy kütüphanesini Python.import üzerinden Swift kodunun içerisine alınabilir.

Bu işlem Swift için PythonObject tipinde dönüş sağlar.

Numpy örneği gibi PyPi üzerinden gelen ya da Python ortamınızda dahil olan paketleri import ile çağırabildiğiniz gibi kendinize ait Python dosyalarınızı da aynı şekilde Swift içerisine dahil edebilirsiniz.

Bu Python dosyaları proje dizin yapısında ya da proje dışında da olabilir.

Gerçekleştirdiğim çözümde Bundle içerisinde bulunan Python paketlerinin path’lerini nasıl dinamik olarak alabileceğinizi bulabilirsiniz.

var pyTestCode: PythonObject {return Python.import("test") // my python module/code}var pyHttpCode: PythonObject {return Python.import("http") // my python module/code}var pyOs: PythonObject {return Python.import("os")}var pySys: PythonObject {return Python.import("sys")}

hazırlanan bir setup function ile module ekleme ve yapılandırma gerçekleştirilmiş

func setupPy(){let os = pyOslet sys = pySys//add own Python  modulesys.path.insert(0, pyPath())}

Dinamik olarak pyPath() fonksiyonu çalışma ortamınızda bulunan Python dosyalarınızı dinamik olarak içeri almanızı sağlayacaktır.

Python file , test.py

Swift üzerinden bu python kod’a ve üyelerine aşağıdaki gibi erişebilirisiniz.

//örnek
let p = pythonImport.pyFunctionName()
let p = pythonImport.pyVariable

test.py dosyasını aşağıdaki gibi kullanılabilir

let test = Python.import(“test”)
print(test.hello())

Swift için örnek arayüzdeki gibi buton’ların içerisinde bu operasyonları çağrılabilir.

@IBAction func runPythonBtnClick(_ sender: Any) {let testPy = pyTestCodeguard let message = String(testPy.hello()) else {resultLabel.stringValue = "Python Script not working"return}resultLabel.stringValue = message}

Python web Request adlı buton içerisinde ise

yukarıdaki Python kodu Python 2 sürümüne uyumlu olduğundan Swift üzerinden çağrılacak Python ortamının belirlenmesi gerekmektedir.

PythonLibrary.useVersion(2, 7)

httpBtn_Click kod

@IBAction func httpBtnClick(_ sender: Any) {if !isPyhton3(){// for urllib2 package check Phyton2let http = Python.import("http")let param : PythonObject = "https://api.github.com/users/oneframemobile/repos"guard let json = String(http.request(param)) else{return}print(json)let alert = NSAlert()alert.messageText = "Python Http Request Example"alert.informativeText = jsonalert.alertStyle = .informationalalert.runModal()}}

Yukarıda Python kodu üzerinden gerçekleştirilen http çağrısını Swift üzerinden çağrılabilir.💕

Özet olarak Python çözümlerinizi Swift ile Arayüzler geliştirebilirsiniz. Swift programlama dili ile hazır Python çözümlerini genişletebilirisiniz.

Konunun devamı için ek çalışmalarla buluşmak dileğiyle ✨✨

Kaynaklar

--

--