Modüller | sys, platform

sys modülü os modülüne benzeyen, sistemle alakalı işlemler yapmamızı sağlayan bir modüldür. Bu modülde bazı fonksiyonları inceleyeceğiz. Bütün fonksiyonları görmek için dir(sys) veya help(sys) komutunu vermeniz yeterli olacaktır; bunu artık öğrendiniz. Ayrıca bu yazıda hem Windows hem de Linux kullanacağım.

İlk önce import sys diyorum ve yazmaya başlıyorum.

sys.stdout.write()

Bu, print() ile aynı işi yapıyor. Zaten oradaki 'out' ifadesi de 'output' yani 'çıktı' anlamına gelir. Hemen bakalım.

Gördüğünüz gibi ekrana yazdırdı. Ancak ufak bir sıkıntımız var. Daha önce gördüğümüz kaçış karakteri olan ve yeni bir satır bırakan '\n' ifadesi bu yapıda yok. Yani yazdıracağını yazdırdıktan sonra bir alt satıra inmeden kapanıyor. Bu sorunu aşmak için cümlenin sonuna, tırnak işaretinin içine bir \n koyabilirsiniz ya da direkt olarak print() kullanabilirsiniz.

sys.stderr.write() ve sys.stderr.flush()

stderr fonksiyonu, hata mesajları vermemizi sağlar. Bunu yaptıktan sonra stderr.flush() dememiz gerekiyor. Peki, neden?

stderr ile verdiğimiz hata mesajı aslında sistemde yer kaplıyor. Dolayısıyla özellikle büyük projelerde bunu kullandıktan sonra bu hafızayı boşaltmanız ve sistemi rahatlatmanız gerekiyor. Yani önce hata mesajını veriyoruz ondan sonra stderr.flush() ile bunu kapladığı alandan atıyoruz.

sys.stdin.readline()

Buradaki 'in' ifadesi de 'input' yani 'girdi' anlamına gelir. 'readline' ise 'satırı oku' anlamındadır. Dolaysıyla bu fonksiyon sayesinde kullanıcıdan girdi alabiliyoruz. Ancak input() fonksiyonundan ufak iki farkımız var.

Bunu bu şekilde kullanabiliyoruz. Elbette, direkt olarak sys.stdin.readline() olarak da kullanabilirsiniz ama ben değişken kullanmayı tercih ettim. Aslında bu fonksiyonun, yazdıklarımızı tuttuğunu, bunu geri yazdırarak göstermek istedim. 

Bu fonksiyon, parametre olarak string alamıyor. Yani input("Bir kelime girin: ") yani sys.stdin.readline("Bir kelime girin: ") tarzında bir şey yapamıyoruz. Bu fonksiyon sadece int değerler alabiliyor. Peki, ne alakası var?

Parametre olarak verdiğiniz sayı, tutulacak karakter sayısını belirtir. Gördüğünüz gibi 5 sayısını verdim ve 9 karakterli olan cyberworm girdisinin yalnızca 5 karakterini tuttu (cyber).

Peki, yazılan her şeyi tutmak istersek ne olur?

Bu ekran görüntüsündeki 5 sayısı pek bir anlam ifade etmiyor. Oraya 1 de yazabilirsiniz ancak bir geri dönüş almak istiyorsanız orayı boş bırakmamanız gerekiyor.

Çakma Keylogger

Şimdi çakma bir keylogger yapacağız. Yazdıklarımızı tutacak sonra da geri döndürecek.

İşte böyle. Kırmızı kutucuk içerisine aldığım kısmı yazmanıza hiç gerek yok ama oraya bir parola falan koyabilirsiniz. Orada söylediğim şey şu: "Eğer kelimelerin içinde 'q' varsa programı kapat". Bunun dışında SMTP kullanarak bu yazıların size mail olarak gelmesini sağlayabilirsiniz. Ya da örneğin bunları bir dosyaya atabilirsiniz. Orası hayal gücünüze kalmış (birine karşı uygulamayın zaten çalışıp çalışmayacağı bile meçhul).

sys.argv

Her şeyden önce Bash Script Argümanlar blogundan bir hatırlatıcı koymak istiyorum. Okumanız yeterli olacaktır ama lütfen okuyun. Ayrıca blogun tamamını da okuyabilirsiniz; içerisinde çeşitli örnekler ve şemalar var yani Bash bilmeseniz bile anlayamayacağınız bir şey söz konusu değil. Blog: Argümanlar

Kısacası; python deneme.py dedikten sonra yanına bir de bir kelime, sayı veya herhangi bir şey girerseniz bu argüman konumuna düşüyor. İşte, burada bunu göreceğiz. Örnekleri gördükçe daha iyi anlayacaksınız. 

İlk önce normal bir program çalıştırırken var olan argümanları görelim.

Sadece print(sys.argv)) dedim ve karşıma deneme.py geldi; bir liste döndü. O zaman ben bu argümanların index'leriyle de oynayabilirim:

Yukarıdaki görüntüde görüyorsunuz; demek ki Python'da bir program çalıştırırken projenin ismi bir argümandır ve bu argüman, sıfırıncı index'e sahiptir. Sıfırıncı index'ten sonra gelecek olan argümanları da sıralayabilirsiniz.

Bakın, programı 'python deneme.py arg2 arg3 arg4' şeklinde çalıştırdım. O zaman burada 4 tane argüman olduğunu söyleyebiliriz. Ayrıca örneğin ikinci index'teki argümanın 'arg3' olduğunu da söyleyebiliriz:

Peki, örneğin ben bir programın çalıştırılma şeklini 'python deneme.py cyberworm' gibi ayarlamak istiyorum. Çünkü o anahtar kelime, kod içerisinde çok önemli bir yere sahip ve o olmadan program çalışmasın istiyorum.

'python deneme.py cyberworm' ifadesinde 'deneme.py' sıfırıncı index iken 'cyberworm' birinci index'tir; artık biliyorsunuz. Oradaki if koşulunun amacı da birinci index'i kontrol etmekti.

if sys.argv[1] != "cyberworm" komutunun anlamı "Eğer birinci index'teki argüman 'cyberworm' değilse..." şeklindedir.

Bu koşulun sağlanması durumunda bir hata mesajı (stderr) veriyorum sonrasında da temizleme işlemini yapıyorum (flush).

'else' kısmı ise, birinci index'teki argümanın 'cyberworm' olması durumunda çalışacaktır.

Çıktı kısmına baktığınız zaman ilk çalıştırma işleminde birinci index için 'CyberWorm' ifadesini verdim ve program bana istediğim sonucu yani hata mesajını verdi. İkinci çalıştırmada ise doğru bir şekilde çalıştırmış olduk.

Başka bir örnek yapalım. Örneğin programım 2 adet argüman alarak çalışıyor olsun; argümanların ne olduğu önemli değil yeter ki iki tane olsun.

Argümanların kaç tane olduğuna bakarken bunların bir listede tutulduğunu görmüştük. O zaman ben len() fonksiyonunu kullanabilirim. O yüzden oraya len(sys.argv) != 3 dedim. Bu noktada orada neden != 3 yazdığımı merak ediyor olabilirsiniz. Hatırlayın; sıfırıncı index'teki argüman zaten projenin ismi idi. Önemli olan, sonrasında verilecek olan 2 argüman oluyor. Bu durumda toplamda 3 argüman olmuş oluyor. Bu yüzden oraya bu şekilde bir ifade yerleştirdim.

Çıktı kısmına bakalım. İlk örnekte hiçbir argüman vermeden direkt olarak python deneme.py olarak çalıştırdım ve bana hata mesajını verdi. Zaten bu koşulda toplam argüman sayısı 1'dir (deneme.py) Ancak bu argüman zaten projenin ismi olduğu için bunu 0 olarak kabul ediyoruz.

İkinci kısımda bu sefer python deneme.py arg1 dedim. Ancak argüman sayısı normalde 2 olarak tutuluyor. Ancak az önce de dediğim gibi deneme.py argümanı bize lazım değil; biz, onun dışında iki argüman arıyoruz. Bu durumda argüman sayımız, 'arg1' ifadesiyle 1 oldu.

Üçüncü ve dördüncü çalıştırma örneklerini inceleyin; benzer şeyler. Üçüncü çalıştırma doğru çalıştırmadır.

sys.version()

Bu, cihazınızın Python versiyonunu ekrana yazdıracaktır.

Dikkat edin python ve python3 versiyonları farklılık gösteriyor. Programı python deneme.py ile çalıştırırsanız Python2'nin sürümünü, python3 deneme.py şeklinde çalıştırırsanız da Python3'ün sürümünü görürsünüz.

sys.platform()

Bu, hangi işletim sistemini kullandığınızı gösterir. Windows ise 'win32', Linux ise 'linux' olacaktır.

Bunu Linux için de deneyebilirsiniz.

sys.platform.startswith()

Bu, duruma göre platformunuzun isminin neyle başladığını bulmaya yarar. Örneğin;

İlk if-else bloğuna bakalım. Burada şunu dedim: "Eğer platformun ismi 'win32' ile başlıyorsa 'evet' yaz; değilse 'hayır' yaz." Benim platformum zaten az önce gördüğünüz gibi win32. Dolayısıyla çıktı kısmının ilk satırına bakarsanız; 'evet' ile başlayan koşulun çalıştığını göreceksinizdir.

İkinci if-else bloğunda ise sistemimin linux olup olmadığını görüyoruz. Burada söylediğim şey: "Eğer platformun ismi 'linux' ile başlıyorsa 'evet' yaz; değilse 'hayır' yaz.". Çıktı kısmının ikinci satırına bakarsanız bu if-else bloğunun da düzgün çalıştığını görürsünüz.

Şimdi, Linux'un kendisinde bunu deneyelim.

Oldukça kullanışlı olduğunu şöyle gösterebilirim. Aşağıdaki görüntü benim GitHub hesabımda var olan gerçek bir kod.

Normalde bu kodun tamamı hem Windows hem de Linux üzerinde çalışıyor ama kodu kullanan Linux kullanıcıları için ek bir özellik ekledim. Windows kullanan biri bu programı çalıştırdığında yeşil kısımdaki kodlar karşısına gelmeyecektir.

platform Modülü

sys ile birbirlerine benzedikleri için ve hazır 'platform'dan bahsetmişken bu modülden de kısaca bahsetmek istedim.

platform modülü, genel olarak cihazınızdaki özelliklere erişmenizi sağlar. Bunu Linux'ta denerseniz yine sistem bilgilerini alırsınız. Kodları aşağı bırakıyorum.

sys.exit()

Hazır Linux'tan söz açılmışken bu fonksiyonu oradan anlatacağım. Çünkü net bir şekilde anlamanız için bu önemli ve bu konu çokça karıştırılan bir konu.

Bu fonksiyon biraz basit gibi görünse de aslında oldukça kapsamlıdır. Bu fonksiyon 0 ve daha büyük değerler alabilen bir fonksiyondur. Peki, sys.exit(0) ne demek?

sys.exit(0), herhangi bir sorunun olmadığını bize gösterir. Yani program normal bir şekilde çalışmış ve sonlanmıştır. O zaman kullanıcının normal bir şekilde çıkış yapması durumunda sys.exit(0) şeklinde programı kapatabiliriz. İçerisine hiçbir şey yazmazsanız bu varsayılan olarak 0 olur. Yani sys.exit() = sys.exit(0).

Şimdi, diğer değerleri iyi anlamak için biraz Shell Script gerekiyor. Bash bilmenize falan gerek yok, anlatacağım.

echo $? komutu bize, o anki durum kodumuzu gösterir. Yani sys.exit(0) ifadesine eş değerdir. 0 değeri, herhangi bir sorun olmadığını bize gösterir. Peki, diyelim ki yanlış bir şey yaptık...

Normal şartlarda 'clear' komutu, terminali temizlemeye yarar. Ancak ben 'clear' komutunu 'clearr' şeklinde yazdım ve bir hata aldım. Hemen sonrasında tekrar echo $? komutunu verdim ve karşıma 0 yerine 127 sayısı çıktı. Neler oluyor?

Bunu internette arattığımda bana; bu durum kodunun sebebinin geçerli olmayan bir komut verilmesinden kaynaklı olduğunu söylüyor. Gerçekten de biraz önce clearr yazarak aslında olmayan bir komutu vermiş ve hata almıştık. Peki, bu durumda sys.exit(127) olmuş olmuyor mu? Kesinlikle.

Hatamızı düzeltelim ve tekrar neler olacağına bakalım.

Bu defa 'clear' dedim ve terminali temizledim. Sonrasında tekrar echo $? komutunu verdim ve karşıma çıkan sayı 0 oldu. İşte, sys.exit() içerisine verilen değerlerin anlamları budur.

Ancak, kesinlikle her hatanın karşılığı olan durum kodunu buraya yazmak zoruna değilsiniz. Eğer herhangi bir sorun oluşarak program kapanırsa oraya 1 veya 2 gibi sayılar da yazabilirsiniz; sorun olmayacaktır. Fakat racona uymak isterseniz şunu yapabilirsiniz:

Kullanıcının, yapmasını beklediğiniz bir hatayı yapması durumunda çıkabilecek hata kodunu görmek isteyebilir ve ona göre bir exit() durum kodu oluşturmak isteyebilirsiniz. Bunun için o hatayı kısaca kendiniz alabilir ve echo $? ifadesini verebilirsiniz. Çıkan kodu da sys.exit(130) şeklinde yazabilirsiniz.

Bunun yanında örneğin kendiniz bir hata listesi oluşturup onları kullanabilir ve ona göre mesajlar verebilirsiniz.

sys ve platform bu şekildeydi.


Yayınlanma Tarihi: 2022-11-26 23:51:59

Son Düzenleme Tarihi: 2022-11-28 21:46:36