İçeriğin Konusu:
- Basit Bir Linux Komutunu Çalıştırın
- Giriş Verileriyle Bir Komut Çalıştırma
- Python Komut Dosyasını Çalıştırın
- Alt İşlem Hatasını Yönetme
- Subprocess.Popen Kodunu Döndürün
- Alt İşlemin Çıktısını Dosyaya Yönlendir
- Subprocess.Popen Kullanarak Çoklu İşleme
- Giriş ve Çıkış Akışını Yönetme S
- Zaman Aşımını ve Gecikmeyi Kontrol Edin
- Akış Girişini Oku
Basit Bir Linux Komutunu Çalıştırın
“Tarih” komutu mevcut sistem tarihini ve saatini görüntülemek için kullanılır. 'Tarih' komutunu yürüten bir alt işlem oluşturan aşağıdaki komut dosyasıyla bir Python dosyası oluşturun ve bu komutun çıktısını yazdırın:
#Modülü içe aktariçe aktarmak alt süreç
#Alt süreç için bir komut tanımlayın ve
#open işlemi Popen() işlevini kullanarak
çıktı = alt süreç . Popen ( [ 'tarih' ] , stdout = alt süreç . BORU )
#Süreçle iletişim kurarak çıktıyı ve hatayı alın
stdout , stderr = çıktı. iletişim ( )
#Çıktıyı yazdır
Yazdır ( stdout. şifreyi çözmek ( ) )
Çıktı:
Önceki betiği çalıştırdıktan sonra aşağıdaki çıktı görünür:
Giriş Verileriyle Bir Komut Çalıştırma
“-c” seçeneği bulunan “wc” komutu, bu komutla sağlanan string değerinin toplam karakter sayısını saymak için kullanılır. “wc –c” komutlarını çalıştırmak için Popen() işleviyle bir alt süreç oluşturan aşağıdaki komut dosyasıyla bir Python dosyası oluşturun. Betik çalıştırıldıktan sonra dize değeri terminalden alınır ve giriş dizesinin toplam karakterleri çıktıda yazdırılır.
#Modülü içe aktariçe aktarmak alt süreç
#Alt süreç için bir komut tanımlayın ve
#Popen() işlevini kullanarak işlemi açın
çıktı = alt süreç . Popen ( [ 'WC' , '-C' ] , stdout = alt süreç . BORU )
#Süreçle iletişim kurarak çıktıyı ve hatayı alın
stdout , stderr = çıktı. iletişim ( )
#Çıktıyı yazdır
Yazdır ( stdout. şifreyi çözmek ( ) )
Çıktı:
“Python Alt İşlem Örnekleri” giriş değeri için aşağıdaki çıktı görünür:
Python Komut Dosyasını Çalıştırın
İki sayının toplamını hesaplayan aşağıdaki komut dosyasıyla 'sum.py' adında bir Python dosyası oluşturun ve bu sayılar komut satırı argümanları olarak sağlanır:
toplam.py
#Gerekli modülü içe aktariçe aktarmak sistem
#Toplam argümanları say
N = sadece ( sistem . argv )
#İlk iki bağımsız değişken değerini ekleyin
toplam = int ( sistem . argv [ 1 ] ) + int ( sistem . argv [ 2 ] )
#Toplama sonucunu yazdır
Yazdır ( 'Toplamı ' + sistem . argv [ 1 ] + ' Ve ' + sistem . argv [ 2 ] + ' dır-dir' , toplam )
Bir Python oluşturun dosya ile Python'u çalıştıracak aşağıdaki komut dosyası dosya adlandırılmış toplam . py ile bir argüman oluşturarak iki argüman alt süreç .
#Modülü içe aktar
içe aktarmak alt süreç
#Alt süreçte python betiğini çalıştır ve
#Popen() işlevini kullanarak işlemi açın
çıktı = alt süreç . Popen ( [ 'python3' , 'toplam.py' , '25' , '55' ] , stdout = alt süreç . BORU ) #Süreçle iletişim kurarak çıktıyı ve hatayı alın
stdout , stderr = çıktı. iletişim ( )
#Çıktıyı yazdır
Yazdır ( stdout. şifreyi çözmek ( ) )
Çıktı:
Önceki betiği çalıştırdıktan sonra aşağıdaki çıktı görünür:
'
Alt İşlem Hatasını Yönetme
'try-hariç' bloğunu kullanarak alt işlemin hatalarını işleyen aşağıdaki komut dosyasıyla bir Python dosyası oluşturun. Kullanıcıdan bir komut alınır ve alt süreç tarafından yürütülür. Kullanıcıdan geçersiz bir komut alındığında hata mesajı görüntülenir.
#Modülleri içe aktariçe aktarmak alt süreç
içe aktarmak sistem
#Kullanıcıdan komut al
emretmek = giriş ( 'Geçerli bir komut girin: ' )
denemek :
#Popen() işlevini kullanarak işlemi açın
çıktı = alt süreç . Popen ( [ emretmek ] , stdout = alt süreç . BORU )
#Süreçle iletişim kurarak çıktıyı ve hatayı alın
stdout , stderr = çıktı. iletişim ( )
#Çıktıyı yazdır
Yazdır ( stdout. şifreyi çözmek ( ) )
hariç :
Yazdır ( 'Hata:' , sistem . exc_info ( ) )
Çıktı:
Geçerli bir komut olan “pwd” komutu girdi olarak alınırsa aşağıdaki çıktı ortaya çıkar:
Geçerli bir komut olan “usr” komutu girdi olarak alınırsa aşağıdaki çıktı ortaya çıkar:
Subprocess.Popen Kodunu Döndürün
Geçerli konumdaki tüm Python dosyalarının listesini almak için alt işlem aracılığıyla bir 'ls' komutunu çalıştıran aşağıdaki komut dosyasıyla bir Python dosyası oluşturun. Betik alt işlemi tamamlamayı bekler ve dönüş kodunu yazdırır.
#Modülleri içe aktariçe aktarmak alt süreç
içe aktarmak sistem
#Komutu ayarla
emretmek = [ 'I' , '-ben' , '*.py' ]
denemek :
#Popen() işlevini kullanarak işlemi açın
çıktı = alt süreç . Popen ( emretmek , stdout = alt süreç . BORU ,
stderr = alt süreç . BORU , metin = Doğru )
#İşlemin tamamlanmasını bekleyin
retKodu = çıktı. Beklemek ( )
#Dönüş kodunu yazdır
Yazdır ( 'Dönüş kodu:' , retKodu )
hariç :
#Yanlış hata mesajı yazdır
Yazdır ( 'Hata:' , sistem . exc_info ( ) )
Çıktı:
Önceki betiği çalıştırdıktan sonra benzer bir çıktı belirir:
Alt İşlemin Çıktısını Dosyaya Yönlendir
Alt işlemin çıktısını bir metin dosyasına yazan aşağıdaki komut dosyasıyla bir Python dosyası oluşturun. Alt süreç tarafından yürütülen komut kullanıcıdan alınır.
#İçe aktarma modülüiçe aktarmak alt süreç
#Dosya adını tanımla
dosya adı = 'çıkış dosyası.txt'
#Ping komutunu al
cmd = giriş ( 'Bir ping komutu girin: ' )
#Alınan girişi alana göre böl
argümanlar = cmd . bölmek ( )
#Komut çıktısını dosyaya yaz
ile açık ( dosya adı , 'İçinde' ) gibi eski veri:
işlem = alt süreç . Popen ( argümanlar , stdout = eski veri )
#İşlemin tamamlanmasını bekleyin
dönüş kodu = işlem. Beklemek ( )
Çıktı:
Aşağıdaki çıktıya göre “ping -c 3 www.google.com ” komutu kullanıcıdan alınır ve alt süreç tarafından yazılan dosyanın içeriğini görüntülemek için “cat” komutu kullanılır:
Subprocess.Popen Kullanarak Çoklu İşleme
Aşağıdaki komut dosyasıyla, çoklu işlem kullanımının alt işlem kullanılarak gösterildiği bir Python dosyası oluşturun. Burada display_msg() adlı bir işlev, çoklu işlem kullanılarak birden çok kez çağrılır.
#Gerekli modülleri içe aktariçe aktarmak çoklu işlem
içe aktarmak alt süreç
#Çoklu işlem tarafından çağrılacak işlevi tanımlayın
kesinlikle display_msg ( N ) :
#Komutu format() işleviyle tanımlayın
cmd = 'echo 'Python Programlama'' . biçim ( N )
#Popen() işlevini kullanarak işlemi açın
işlem = alt süreç . Popen ( cmd , kabuk = Doğru , stdout = alt süreç . BORU )
#Süreçle iletişim kurarak çıktıyı ve hatayı alın
stdout , hata = işlem. iletişim ( )
#Çıktıyı yazdır
Yazdır ( stdout. şifreyi çözmek ( ) )
#Çoklu işleme havuzunu oluşturarak işlevi 5 kez çağırın.
ile çoklu işlem. Havuz ( çoklu işlem. cpu_count ( ) ) gibi mp:
#Fonksiyonu eşle
mp. harita ( display_msg , menzil ( 1 , 5 ) )
Çıktı:
Önceki betiği çalıştırdıktan sonra aşağıdaki çıktı görünür:
Giriş ve Çıkış Akışlarını Yönetme
Bu örneğin Python betiğini oluşturmadan önce aşağıdaki içeriğe sahip “test.txt” adında bir metin dosyası oluşturun.
test.txt
PERL
piton
darbe
php
Aşağıdaki komut dosyasıyla, 'test.txt' dosyasının içeriğini okumak için bir alt işlem ve o metin dosyasında belirli bir kelimeyi aramak için başka bir alt işlem kullanan bir Python dosyası oluşturun. Burada bu kelimenin yer aldığı “test.txt dosyası” içerisinde “python” kelimesi aranmaktadır.
#Modülleri içe aktariçe aktarmak alt süreç
#Giriş akışı için bir süreç tanımlayın
süreç içi = alt süreç . Popen ( [ 'kedi' , 'test.txt' ] , stdout = alt süreç . BORU , metin = Tru > #Çıktı akışı için bir süreç tanımlayın
out_process = alt süreç . Popen (
[ 'kavramak' , 'piton' ] , standart = in_process. stdout ,
stdout = alt süreç . BORU , metin = Doğru )
#Giriş ve çıkış işlemlerinin çıktısını saklayın
çıktı , _ = out_process.out_process. iletişim ( )
#Çıktıyı yazdır
Yazdır ( 'Çıktı:' , çıktı )
Çıktı:
Betiği çalıştırdıktan sonra aşağıdaki çıktı görünür:
Bir Zamanlayıcı Kullanarak Alt Süreci Kontrol Etme
Bir alt işlemi kullanarak bir komutu yürütmek için bir zamanlayıcı kullanan, aşağıdaki komut dosyasıyla bir Python dosyası oluşturun. Burada “try-hariç” bloğu zamanlayıcıyı başlatmak için, “finally” bloğu ise zamanlayıcıyı iptal etmek için kullanılır.
#Alt işlem modülünü içe aktariçe aktarmak alt süreç
#Zamanlayıcı modülünü içe aktar
itibaren iplik geçirme içe aktarmak Zamanlayıcı
#Komutu tanımla
cmd = [ 'ping' , 'www.example.com' ]
#İşlemi aç
P = alt süreç . Popen (
cmd , stdout = alt süreç . BORU , stderr = alt süreç . BORU )
#Zamanlayıcıyı tanımla
zamanlayıcı = Zamanlayıcı ( 2 , lambda süreç: süreç. öldürmek ( ) , [ P ] )
denemek :
#Zamanlayıcıyı başlat
zamanlayıcı. başlangıç ( )
#Çıktıyı oku
stdout , _ = P. iletişim ( )
#Çıktıyı yazdır
Yazdır ( stdout. şifreyi çözmek ( ) )
hariç :
#Yanlış hata mesajı yazdır
Yazdır ( 'Hata:' , sistem . exc_info ( ) )
Sonunda :
#Zamanlayıcıyı durdur
zamanlayıcı. iptal etmek ( )
Çıktı:
Betiği çalıştırdıktan sonra aşağıdaki çıktı görünür:
Akış Girişini Okuyun
Bir 'while' döngüsü kullanarak alt işlem çıktısının içeriğini okuyan ve içeriği bir değişkene depolayan bir Python dosyası oluşturun. Bu değişkenin içeriği daha sonra yazdırılır. Burada alt işlemde “curl” komutu kullanılmaktadır. www.google.com URL'si.
#İçe aktarma modülüiçe aktarmak alt süreç
#Komutu tanımla
cmd = [ 'kıvrılma' , 'www.example.com' ]
P = alt süreç . Popen ( cmd , stdout = alt süreç . BORU ,
stderr = alt süreç . BORU , metin = Doğru >
#Çıkış değişkenini başlat
çıktı = ''
sırasında Doğru :
#İşlem çıktısını satır satır oku
içinde = P. stdout . okuma satırı ( )
#Alt işlem bittiğinde döngüden çık
eğer Olumsuz :
kırmak
çıktı = çıkış + ln
#Satırı yazdır
Yazdır ( çıktı )
#İşlemi bitirdikten sonra dönüş kodunu alın
dönüş kodu = P. Beklemek ( )
#Dönüş kodunu yazdır
Yazdır ( 'Dönüş kodu: ' , dönüş kodu )
Çıktı:
Üç çıkışın son kısmı aşağıdaki resimde gösterilmektedir. Alt işlemi tamamladıktan sonraki dönüş kodu 0'dır:
Çözüm
Python subprocess.Popen()'ın farklı kullanımları, bu eğitimde Python kullanıcılarının bu fonksiyonun temel kullanımlarını bilmelerine yardımcı olacak birden fazla Python betiği kullanılarak gösterilmektedir.