Python Subprocess

subprocess modülü, yeni bir process oluşturmayı sağlayan, bunların girdi-çıktılarını ele alma imkânı veren ve dönüş kodlarını almayı sağlayan bir modüldür. Yani daha basit bir şekilde, program içinde program çalıştırmaya imkan veren bir modüldür.

Subprocess Modülünün Kullanımı

subprocess basit bazı process'leri kullanmak için birkaç tane fonksiyon sunuyor. Daha karmaşık bir process çalıştırmak isterseniz, Popen sınıfını kullanabilirsiniz. Bunlara detaylı bir şekilde değinmeye çalışacağız. Şimdi basit fonksiyonları inceleyelim
subprocess.call()

Bu fonksiyon, kendisine verilen komutu parametrelerle birlikte çalıştırır, sonra da bu komutun işlenmesini bekler. Komutların işlenmesi bittikten sonra durum kodunu geri döndürür. Biz de bu durum koduna bakarak işlemin başarılı bir şekilde sonuçlandırılıp sonuçlandırılmadığını kontrol ederiz. Genelde başarılı sonuçlar için 0 sonuç kodu geri döndürülür. Örnek kullanım


Bu komut, programın bulunduğu dizindeki dosyaları listeleyecektir. Eğer hiçbir hata meydana gelmezse bize 0 durum kodunu geri döndürecektir.

call() fonksiyonu sadece  çalıştıracağı process'in argümanlarını almaz, aynı zamanda bu process'in girdi ve çıktılarını da parametre olarak alabilir. Yani şunu demek istiyorum. Diyelim ki çalıştırdığınız process bir çıktı, bir sonuç üretti. Bu çıktıyı nasıl elde edeceğiz? Örneğin Windows sistemlerindeki "dir" komutu ile bulunduğumuz dizindeki dosyaların listesini görebiliriz. Peki bunu python programımızda subprocess olarak çalıştırırsak, listelenen bu dosyalara nasıl ulaşabiliriz?

Bir process çalıştığı zaman çıktıları "stdout", girdileri "stdin" olarak ele alınır. Bu ikisini bir dosyaya yönlendirirseniz çıktılar bir dosyaya yazılır, girdiler bir dosyadan okunur. Ancak dosyaya yönlendirmek yerine program içinde de ele almak isteyebilirsiniz. Bunun için subprocess tarafından PIPE kullanımı sağlanmıştır.

subproces.check_call() 

Bu metodun yaptığı iş de, call() fonksiyonu ile aynıdır. Ancak call() fonksiyonundan farkı şudur. Eğer bir komut 0 dışında bir durum kodu ile döndüyse, bir CalledProcessError hatası fırlatır. Bu hatayı try-except blokları ile kontrol edebilirsiniz.

subprocess.check_output()

Bir komutu çalıştırır ve çıktısını geri döndürür. Eğer bir komutu çalıştırdıktan sonra bu komutun çıktısına ihtiyaç duyuyorsanız bu fonksiyonu kullanabilirsiniz. Örneğin yerel IP adresinizi elde etmek istiyorsunuz ve her seferinde komut satırında yazmak istemiyorsunuz. Bu durumda aşağıdaki gibi çıktısını alıp, IP adresinizi ayıklayabilirsiniz. IP adresini elde etmek istediğimiz arayüz "Kablosuz"



Kablosuz kısmına, diğer ethernet arayüzlerinizin ismini yazabilirsiniz. Biz sadece kablosuz yerel ip adresimizi elde ettik.

Popen Kurucu Sınıfı


Process oluşturma, yönetme işlemlerini bir sınıf yapısı altında yapmak her zaman daha temiz bir kod yazma olanağı sağlar. Aynı zamanda daha fazla esneklik sunar. Şimdi bir Popen sınıfının yapısını inceleyelim.



Bu sınıfın tüm parametrelerini anlatmayacağım, bunun yerine en çok işe yarar olanlarını anlatmaya çalışacağım. İlk olarak Popen sınıfı, subprocess modülünün altında bulunur. Yani şu şekilde kullanacağız

Şimdi bu sınıfın alabileceği argümanlardan bazılarını sırayla incelemeye başlayalım.

Birinci argümanımız args. Bu argüman bir karakter dizisi veya liste olmalıdır. Bu argüman, çalıştırılacak komutları temsil eder. Kısaca çalıştırmak istediğimiz komutları bu argümana veririz. Eğer komutunuzu bir liste olarak verirseniz, bu listenin ilk elemanı çalıştırılabilir program olarak ele alınacaktır. Bu yüzden Popen ile bir programı çalıştıracaksanız ve args argümanını liste olarak verdiyseniz,listenin ilk elemanı bu programın adı olmalıdır. Diğer elemanları ise, varsa programa gönderilecek argümanlar olmalıdır.

Diğer argümanımız ise, shell. Bu argüman True veya False olmak üzere iki değer alabilir. Eğer komut satırının özelliklerini kullanmak isterseniz shell = True yapmalısınız. Örnek vermek gerekirse Windows üzerinde dir komutunu çalıştırmak isterseniz shell = True olmalıdır çünkü dir komutu, DOS ortamında çalışan bir komuttur ve bunu kullanabilmek için shell parametresini ayarlamalıyız

İnceleyeceğimiz son 3 argüman, stdin,stdout,stderr. Bazen programlar, birtakım işlemler yaptıktan sonra çıktılar meydana getirirler veya birtakım işlemleri yapabilmek için girdilere ihtiyaç duyarlar. İşte bu girdiler ve çıktılar bu 3 argüman tarafından belirlenebilir.Yukarıda giriş kısmında da yazdığım gibi girdi ve çıktıları ele alabilmemize imkan verir. Yani process çıktısını bir dosyaya aktarabiliriz veya process birtakım girdilere ihtiyaç duyuyorsa bu process'i stdin argümanı ile bir dosyadan okuma yapacak şekilde ayarlayabiliriz.

Basit bir örnek yapalım. dir komutunun çıktısını liste.txt dosyasına aktaran bir program yazalım.

Programı çalıştırırsanız, bulunduğunuz dizinde bir cikti.txt dosyası oluşacak ve içerisinde dizindeki dosyaları listesi olacaktır.

stderr argümanı için de, aynı şeyleri yapmak mümkündür.

Subprocess modülüne dair anlatacaklarım bu kadar. Bu belgeyi mümkün olduğunca sürekli güncellemeye çalışıyorum, hatalar varsa bildirmenizi rica ediyorum.
İyi çalışmalar.

2 yorum:

  1. process oluşturmak nedemek hocam

    YanıtlaSil
    Yanıtlar
    1. İşletim sistemlerinde çalışan her bir programa verilen isim diyebiliriz. Process kavramı programın hafızadaki yeri, kaynak kodları, etki alanı, yetkileri gibi birçok niteliği de kapsıyor. Process oluşturmak demek de bir programı işletim sisteminde çalışır hale getirmek demek yani programı çalıştırmak.

      Sil