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
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.
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.
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.
process oluşturmak nedemek hocam
YanıtlaSilİş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