Bu yazıda Pardus’a sistemdeki uygulamaları çalıştırıp çıktılarını okuyabilen basit bir GTK3 uygulaması yapacağız.

İlk derste oluşturduğumuz basit şablon programımızı alalım ve üzerine devam edelim.

Glade ile GTK3 arayüzümüzü geliştirelim

İlk dersten kalan arayüzümüzde ana GtkBox’ımızın 3. elemanına bir GtkLabel ekleyelim.

Eklediğimiz GtkLabel’ın ismini lbl_output yapalım. Bu etiketimize(label) çalıştıracağımız programların çıktılarını bastıracağız.

Ortadaki butona da “Ben kimim” yazalım:

Merhaba Dünya etiketine ihtiyacımız kalmadı. Onun yerine de yine bir buton koyalım ve bu buton kök dizinin içeriğini lbl_output etiketine yazdırsın.(btn_listele)

Butonlarımıza “clicked” yani “tıklandı” sinyallerini ekleyelim.

  • on_btn_listele_clicked
  • on_btn_ben_kimim_clicked

Arayüzümüz hazır. Şimdi program kısmına geçelim.

Python ile alt program çağırma

Python3’te yazdığımız program içerisinden başka bir programı çalıştırıp çıktısını okumak istediğimizde Python3’te standart olarak bulunan subprocess kütüphanesini kullanacağız.

Öncelikle subprocess’i MainWindow.py dosyamıza dahil edelim:

import subprocess

subprocess ile bir programı çalıştırmak için subprocess.run() fonksiyonunu kullanıyoruz.

subprocess.run("whoami", capture_output=True)

capture_output bayrağını True yaparak çalıştırılan processin stdout ve stderr çıktılarını okuyabiliriz.

whoami, programı çalıştıran kullanıcının ismini ekrana yazdıran bir programdır.

process = subprocess.run("whoami", capture_output=True)print(process.stdout) # Standart Output çıktıları
print(process.stderr) # Bir hata olduysa Standart Error çıktıları
print(process.returncode) # Process'in return kodu.

Şimdi “Ben kimim” butonumuzun çalıştıracağı fonksiyonu yazalım, fakat ondan önce lbl_output etiketimizin içeriğini değiştirmek için MainWindow.py içinde tanımlayalım:

class MainWindow:
    def __init__(self, app):
        # Gtk Builder
        self.builder = Gtk.Builder()        # Import UI file:
        self.builder.add_from_file("MainWindow.glade")
        self.builder.connect_signals(self)        # Window
        self.window = self.builder.get_object("window")
        self.window.set_application(app)
        
        # Glade'deki elemanlari kullanmak icin degiskene atayalim:
        self.defineComponents() # <--------------
        
        # Show window
        self.window.show_all()
    
    def defineComponents(self):
        self.lbl_output = self.builder.get_object("lbl_output")

Şimdi btn_ben_kimim butonumuzun çalıştıracağı fonksiyonu yazalım:

def on_btn_ben_kimim_clicked(self, btn):
        process = subprocess.run(["whoami"], capture_output=True)
        output = process.stdout.decode("utf-8")
        
        self.lbl_output.set_label(output)

Process’imizin çıktısı Python3’te bytes tipinde olduğu için önce onu decode fonksiyonu ile string’e çevirmeliyiz: process.stdout.decode("utf-8")

Böylece whoami komutunu çalıştırıp çıktısını okuduk ve lbl_output’a yazdırdık.

Geriye btn_listele butonumuz kaldı, onun mantığı da aynı şekilde, sadece çalıştıracağımız programı değiştireceğiz, ls / yapacağız.

    def on_btn_listele_clicked(self, btn):
        process = subprocess.run(["ls", "/"], capture_output=True)
        output = process.stdout.decode("utf-8")
        
        self.lbl_output.set_label(output)

Evet programımız hazır, artık siz de istediğiniz programları çalıştırıp çıktılarını okuyabilirsiniz.

Programımızın çıktısı

Python’da subprocess gibi sistem çağrıları yapabildiğimiz diğer bir kütüphane ise: os

import os ile bu kütüphaneyi ekledikten sonra kullanılan işletim sistemi hakkında bilgi edinebilir, giriş yapmış kullanıcıyı görebilir, dosyaları listeleyebilir, ortam değişkenlerini (Environment Variables) okuyabilirsiniz.

import os.getenv("PATH") # PATH ortam değişkenini okuma.
os.getlogin() # Oturum açmış kullanıcı adı.
os.getuid() # Oturum açmış kullanıcı ID'si.os.getpid() # Çalışan process'in ID'si.
os.getppid() # Çalışan process'in ebeveyn process ID'si.# ... Ve daha bir çok sistem komutu.

os kütüphanesi ve fonksiyonları için: https://docs.python.org/3/library/os.html

Bir diğer kütüphanemiz ise pathlib .

Yine import pathlib şeklinde programımıza dahil edebileceğimiz bu kütüphane ile dizin yolları işlemleri gerçekleştirebiliyoruz.

import pathlibpath = pathlib.Path('/')
path.is_dir() # Bu yol bir dizin mi
path.exists() # Bu yol mevcut mu# ...

pathlib kütüphanesi ve fonksiyonları için: https://docs.python.org/3/library/pathlib.html

Bu yazıda basitçe Python3 ve GTK3 kullanarak sistemin kendisi ve sistem uygulamalarıyla etkileşime geçme örneği gerçekleştirdik.

Selametle kalınız.