Alt İşlem Çalıştırma Yöntemini Kullanarak Python'da Kabuk Komutları Nasıl Yürütülür

How Execute Shell Commands Python Using Subprocess Run Method



Alt işlem, yeni işlemler oluşturmak ve bunların giriş ve çıkış veri akışlarıyla etkileşim kurmak için kullanılabilen yerleşik bir Python modülüdür. Daha basit bir ifadeyle, kabuk komutlarını çalıştırmak ve genellikle bir Linux dosya sistemi genelinde çeşitli bin klasörlerine dağılmış yürütülebilir ikili dosyaları çalıştırmak için kullanabilirsiniz. Ayrıca yürütülebilir bir ikili dosyanın tam yolunu sağlayabilir ve ikili dosyayla ilişkili herhangi bir komut satırı anahtarını kullanabilirsiniz. Bu makale, Python uygulamalarında alt süreç modülünün ve çalıştırma yönteminin nasıl kullanılacağını açıklayacaktır. Makaledeki tüm kod örnekleri Ubuntu 20.04 üzerinde Python 3.8.2 ile test edilmiştir.

Subprocess.run Yöntemi

Subprocess.run yöntemi, bir bağımsız değişken listesi alır. Yöntem çağrıldığında, komutu yürütür ve işlemin bitmesini bekler ve sonunda bir CompletedProcess nesnesi döndürür. CompletedProcess nesnesi, stdout, stderr, yöntem çağrılırken kullanılan orijinal bağımsız değişkenler ve bir dönüş kodu döndürür. Stdout, komut tarafından üretilen veri akışını ifade ederken, stderr, programın yürütülmesi sırasında ortaya çıkan herhangi bir hatayı ifade eder. Sıfır olmayan herhangi bir dönüş kodu (çıkış kodu), subprocess.run yönteminde yürütülen komutla ilgili hata anlamına gelir.







Örnek 1: Subprocess.run Yöntemini Kullanarak Bir Metin Dosyasının İçeriğinin Çıktısını Alın

Aşağıdaki komut, bir name=John dizesi içerdiğini varsayarak, bir data.txt dosyasının içeriğini çıkaracaktır.



içe aktarmak alt süreç
alt süreç.Çalıştırmak(['kedi', 'veri.txt'])

Yukarıdaki kodu çalıştırmak aşağıdaki çıktıyı döndürür:



isim=John
Tamamlanan Süreç(argümanlar=['kedi', 'veri.txt'],dönüş kodu=0)

Liste bağımsız değişkeninin ilk öğesi, yürütülecek komutun adıdır. Listedeki ilk öğeyi izleyen herhangi bir öğe, komut satırı seçenekleri veya anahtarları olarak kabul edilir. Seçenekleri tanımlamak için tek tire ve çift tire de kullanabilirsiniz. Örneğin, bir dizindeki dosya ve klasörleri listelemek için kod, subprocess.run([ls, -l] olacaktır. Bu durumların çoğunda, bir kabuk komutundaki boşlukla ayrılmış herhangi bir argümanı, komut dosyasında ayrı bir öğe olarak düşünebilirsiniz. subprocess.run yöntemine sağlanan liste.





Örnek 2: Subprocess.run Yönteminin Çıktısını Bastırın

subprocess.run yönteminin çıktısını bastırmak için, ek argüman olarak stdout=subprocess.DEVNULL ve stderr=subprocess.DEVNULL sağlamanız gerekir.

içe aktarmak alt süreç

alt süreç.Çalıştırmak(['kedi', 'veri.txt'],standart=alt süreç.DEVNULL,
standart=alt süreç.DEVNULL)

Yukarıdaki kodu çalıştırmak aşağıdaki çıktıyı üretecektir:



CompletedProcess(args=['cat', 'data.txt'], dönüş kodu=0)

Örnek 3: Subprocess.run Yönteminin Çıktısını Yakalama

subprocess.run yönteminin çıktısını yakalamak için, catch_output=True adlı ek bir bağımsız değişken kullanın.

içe aktarmak alt süreç
çıktı= alt süreç.Çalıştırmak(['kedi', 'veri.txt'],yakalama_çıktı=NS)
Yazdır (çıktı)

Yukarıdaki kodu çalıştırmak aşağıdaki çıktıyı üretecektir:

Tamamlanan Süreç(argümanlar=['kedi', 'veri.txt'],dönüş kodu=0,
standart=B'isim = John ',standart=B'')

output.stdout ve output.stderr yöntemlerini kullanarak stdout ve stderr değerlerine ayrı ayrı erişebilirsiniz. Çıktı bir bayt dizisi olarak üretilir. Çıktı olarak bir dize almak için output.stdout.decode(utf-8) yöntemini kullanın. Çıktıyı dize biçiminde almak için subprocess.run çağrısına ek bir argüman olarak text=True da sağlayabilirsiniz. Çıkış durum kodunu almak için output.returncode yöntemini kullanabilirsiniz.

Örnek 4: Subprocess.run Yöntemi Tarafından Yürütülen Komutun Başarısızlığında İstisna Yükseltme

Komut sıfır olmayan bir durumla çıktığında bir istisna oluşturmak için check=True bağımsız değişkenini kullanın.

içe aktarmak alt süreç
alt süreç.Çalıştırmak(['kedi', 'veri.tx'],yakalama_çıktı=NS,Metin=NS,Kontrol=NS)

Yukarıdaki kodu çalıştırmak aşağıdaki çıktıyı üretecektir:

CalledProcessError (retcode, process.args,
subprocess.CalledProcessError: '['cat', 'data.tx']' komutu
döndürülen sıfır olmayan çıkış durumu 1.

Örnek 5: Subprocess.run Yöntemi Tarafından Yürütülen Komuta Bir Dize İletin

input='string' argümanını kullanarak subprocess.run yöntemiyle yürütülecek komuta bir dize iletebilirsiniz.

içe aktarmak alt süreç
çıktı= alt süreç.Çalıştırmak(['kedi'], giriş='veri.txt',yakalama_çıktı=NS,
Metin=NS,Kontrol=NS)
Yazdır (çıktı)

Yukarıdaki kodu çalıştırmak aşağıdaki çıktıyı üretecektir:

CompletedProcess(args=['cat'], returncode=0, stdout='data.txt', stderr='')

Gördüğünüz gibi, yukarıdaki kod data.txt dosyasını bir dosya nesnesi olarak değil, bir dize olarak iletir. data.txt dosyasını dosya olarak iletmek için stdin bağımsız değişkenini kullanın.

ile birlikte açık('veri.txt') olarakF:
çıktı= alt süreç.Çalıştırmak(['kedi'],standart=F,yakalama_çıktı=NS,
Metin=NS,Kontrol=NS)
Yazdır (çıktı)

Yukarıdaki kodu çalıştırmak aşağıdaki çıktıyı üretecektir:

CompletedProcess(args=['cat'], returncode=0, stdout='name=John ', stderr='')

Örnek 6: Subprocess.run Yöntemini Kullanarak Komutu Doğrudan Kabukta Yürütün

Ana komutta ve onu takip eden seçeneklerde bölünmüş bir dize kullanmak yerine, bir komutu olduğu gibi doğrudan bir kabuğa çalıştırmak mümkündür. Bunu yapmak için ek bir argüman olarak Shell=True iletmelisiniz. Ancak bu, python geliştiricileri tarafından Shell=True kullanılması güvenlik sorunlarına yol açabileceğinden önerilmez. Güvenlik etkileri hakkında daha fazla bilgiyi şuradan okuyabilirsiniz: Burada .

içe aktarmak alt süreç
alt süreç.Çalıştırmak('kedi 'data.txt'',kabuk=NS)

Yukarıdaki kodu çalıştırmak aşağıdaki çıktıyı üretecektir:

isim=John

Çözüm

Python'daki subprocess.run yöntemi, python'un kendi içinde kabuk komutlarını çalıştırmanıza izin verdiği için oldukça güçlüdür. Bu, ayrı dosyalarda ek kabuk komut dosyası koduna gerek kalmadan tüm kodu python'un kendisiyle sınırlamaya yardımcı olur. Bununla birlikte, bir python listesindeki kabuk komutlarını doğru bir şekilde belirtmek oldukça zor olabilir. Basit kabuk komutlarını simgeleştirmek için shlex.split() yöntemini kullanabilirsiniz, ancak uzun, karmaşık komutlarda - özellikle boru sembolleri olanlarda - shlex komutu doğru şekilde bölemez. Bu gibi durumlarda, hata ayıklama zor bir konu olabilir. Bundan kaçınmak için shell=True argümanını kullanabilirsiniz, ancak bu eylemle ilgili bazı güvenlik endişeleri vardır.