Modüller | subprocess

subprocess modülü sayesinde terminalde istediğimiz komutları çalıştırabiliyoruz. Önce nasıl kullanıldığına bakalım. Bu blogda Windows ve Linux karışık şekilde gideceğim ama Linux'ta yaptıklarımı Windows için uygun Shell komutlarını vererek uygulayabilirsiniz.

Örneğin Linux'ta ifconfig komutu ile ağ bilgilerinizi görebilirsiniz. Aynısı Windows için 'ipconfig' veya 'ipconfig/all' şeklindedir.

Şimdi, bu komutun çıktısını subrocess ile alacağız. Fakat her şeyden önce sürekli subprocess. dememek için import subprocess as sub diyerek başlıyorum.

sub.call() dedikten sonra parantezler arasına bir köşeli parantez açıyoruz ve bu köşeli parantezin içerisine, istediğimiz komutu tırnak işaretleri arasında yazıyoruz. Adımlarını göstereyim.

sub.call()

sub.call([])

sub.call([""])

sub.call(["ifconfig"])

Çıktı kısmında gördüğünüz üzere ifconfig demek yerine python deneme.py diyerek sadece kodumu çalıştırdım ve ifconfig çalışmış oldu. Aynısını Windows için yapmak isterseniz sub.call(["ipconfig"]) yazmanız yeterli olur.

Mesela şimdi, DNS Flush işlemini Windows'ta yapalım. Ne olduğunu bilmiyorsanız 'DNS' blogunu okuyabilirsiniz. Komutları kullanmanın başka yollarını da görmeniz için gösteriyorum.

Ben bu kodu çalıştırdığımda DNS Flush işlemi yapılmış oldu. Yani bu kod, normal bir şekilde CMD ekranına yazacağım 'ipconfig /flushdns' işlemi ile aynıdır. Hatta yapalım.

Gördüğünüz gibi ikisi de aynı işlemi yaptı.

Bazı işlemleri subprocess ile tam olarak yapamıyoruz. Örneğin Windows'ta sub.call(["dir"]) veya Linux'ta sub.call(["ls -l"]) derseniz hata alırsınız. Bunun sebebi, bu komutların Shell'e yerleşik olmasından kaynaklıdır. Yani subprocess bunlara erişemez. Tam bu noktada subprocess'e bir argüman verebiliriz: shell=True.

Gördüğünüz gibi hata aldık. subprocess modülüne, bu komutun Shell'e ait olduğunu söylememiz gerekiyor.

shell=True dedikten sonra komutumuz gerektiği gibi çalıştı. Aynı şekilde shell=True parametresini Windows için de kullanabilirsiniz. Ancak bunu, köşeli parantezlerin dışına yazmanız ve köşeli parantezler ile ayırmak için bir virgül kullanmanız gerekir.

İstediğiniz komutları kullanabiliyorsunuz. Örneğin burada 'ls -l' çalıştırdık ve beş saniye sonra ekranı temizleyecek.

Örneğin ifconfig sonuçlarını başka bir terminalde görmek istiyorsunuz. O zaman ne yapabiliriz?

xterm dediğimiz bir terminal türü vardır (ekranda gördüğünüz küçük siyah ekran). Buradaki 'Popen' ifadesi, call ile aynı işi yapıyor. Hatta 'sub.run' ifadesini de kullanabilirsiniz. Sonrasında, % işaretine kadar gelen komutlar ise xterm terminalini açıp açık tutmak için kullanılıyor. command ise, xterm içerisinde çalıştırılacak komutu ifade ediyor.

Diyelim ki başka bir programın python3 ile başka bir terminalde çalıştırılması lazım; bunu yapalım. Bunun için hello.py adında bir Python dosyası açtım ve içine sadece print("Hello World") yazdırdım. Şimdi, deneme.py dosyamıza dönelim.

sub.call([]) kısmına, xterm'in açılması için komutları veriyoruz ve hangi dosayı çalıştıracaksak onu yazıyoruz; 'python3 hello.py'. Sonrasında 'os' modülünden hatırlayacağınız üzere 'current working directory - cwd' ile o dosyanın lokasyonunu belirliyoruz.

Peki buradaki mantık ne? Örneğin siz, ana bir çalışma dosyası oluşturdunuz ve bu dosyanın altında birkaç tane çalışma dosyası mevcut. Siz o birkaç çalışma dosyasının çıktılarını kullanıcıya göstermek zorunda kalabilirsiniz; bu durum özellikle siber güvenlik araçlarında görülür. Böyle bir durumda yapılacaklar arasındaki bir alternatif, subprocess'in bu şekildeki kullanımıdır. Burada birkaç tane terminal de açabildiğinizi unutmayın.


Yayınlanma Tarihi: 2022-11-27 14:21:46

Son Düzenleme Tarihi: 2022-11-30 12:25:18