Python'da Alt İşlem nedir? [5 Kullanım Örneği]
Yayınlanan: 2021-05-23Alt süreçler, İşletim Sistemi ile tamamen yeni bir düzeyde etkileşim kurmanıza izin verir.
Bilgisayarımız her zaman alt süreçleri çalıştırır. Aslında, sadece bu makaleyi okuyarak, bir ağ yöneticisi veya internet tarayıcısının kendisi gibi birçok işlemi çalıştırıyorsunuz.
Bununla ilgili harika olan şey, bilgisayarımızda yaptığımız herhangi bir eylemin bir alt işlemi başlatmayı içermesidir. Python'da basit bir "merhaba dünya" betiği yazıyor olsak bile bu doğru kalır.
Bir süredir programlama öğreniyor olsanız bile, alt süreç kavramı belirsiz görünebilir. Bu makale, alt işlemin ana konseptine ve Python alt işlem standart kitaplığının nasıl kullanılacağına derinlemesine bakacaktır.
Bu eğitimin sonunda şunları yapacaksınız:
- Alt süreç kavramını anlamak
- Python alt süreç kitaplığının temellerini öğrendiniz
- Yararlı örneklerle Python becerilerinizi geliştirin
hadi içeri girelim
Alt süreç kavramı
Genel olarak, bir alt süreç, başka bir süreç tarafından oluşturulan bir bilgisayar sürecidir.
Bir alt süreci, her bir üst sürecin arkasında çalışan alt süreçlere sahip olduğu bir ağaç olarak düşünebiliriz. Bunun oldukça kafa karıştırıcı olabileceğini biliyorum, ancak basit bir grafikle görelim.

Bilgisayarımızda çalışan işlemi görselleştirmenin birkaç yolu vardır. Örneğin, UNIX'te (Linux & MAC) etkileşimli bir süreç görüntüleyici olan htop'a sahibiz.

Ağaç modu , çalışan alt süreçlere bakmak için en kullanışlı araçtır. F5 ile aktif hale getirebiliriz.
Komut bölümüne yakından bakarsak, bilgisayarımızda çalışan işlemlerin yapısını fark edebiliriz.

Her şey bilgisayarımızda her işlemi başlatan komut olan /sbin/init ile başlar. Bu noktadan itibaren, xfce4-screenshoter ve xfce4-terminal gibi diğer işlemlerin başlangıcını görebiliriz.
Windows'a bir göz attığımızda, makinemizdeki bu kilitlenen programları öldürürken faydalı olan efsanevi görev yöneticisine sahibiz.

Artık kristal berraklığında bir konseptimiz var. Python'da alt süreçleri nasıl uygulayabileceğimizi görelim.
Python'da alt süreçler
Python'daki bir alt süreç, bir python betiğinin İşletim sistemine (OS) devrettiği bir görevdir.
Alt süreç kitaplığı, alt süreçleri doğrudan Python'dan yürütmemizi ve yönetmemizi sağlar. Bu, standart girdi stdin , standart çıktı stdout ve dönüş kodlarıyla çalışmayı içerir.
Python standart kitaplığının bir parçası olduğu için onu PIP ile kurmamız gerekmiyor.
Bu nedenle, sadece modülü içe aktararak python'da alt süreçleri kullanmaya başlayabiliriz.
import subprocess # Using the module ....Not: Bu makaleyi takip etmek için Python 3.5 + sürümüne sahip olmalısınız.
Şu anda sahip olduğunuz python sürümünü kontrol etmek için sadece çalıştırın.
❯ python --version Python 3.9.5 # My resultAlacağınız Python sürümünün 2.x olması durumunda aşağıdaki komutu kullanabilirsiniz.
python3 --versionKonuya devam edersek, alt süreç kitaplığının arkasındaki ana fikir, istediğimiz komutları doğrudan Python yorumlayıcısından yürüterek işletim sistemi ile etkileşime girebilmektir.
Bu, işletim sistemimiz izin verdiği sürece istediğimiz her şeyi yapabileceğimiz anlamına gelir (ve kök dosya sisteminizi kaldırmadığınız sürece).
Geçerli dizinin dosyalarını listeleyen basit bir komut dosyası oluşturarak nasıl kullanılacağını görelim.
İlk alt süreç uygulaması
İlk önce list_dir.py dosyasını oluşturalım . Bu, listeleme dosyalarını deneyeceğimiz dosya olacaktır.
touch list_dir.pyŞimdi o dosyayı açalım ve aşağıdaki kodu kullanalım.
import subprocess subprocess.run('ls')İlk önce alt işlem modülünü içe aktarıyoruz ve ardından argüman olarak ilettiğimiz komutu çalıştıran fonksiyon çalıştırmasını kullanıyoruz.
Bu işlev Python 3.5'te subprocess.Popen için kolay bir kısayol olarak tanıtıldı. subprocess.run işlevi, daha sonra iletişim kurma seçeneğine sahip olduğumuz Popen'in aksine, bir komutu çalıştırmamıza ve bitmesini beklememize izin verir.
Kod çıktısı hakkında ls , ls , bulunduğunuz dizindeki dosyaları listeleyen bir UNIX komutudur. Bu nedenle, bu komutu çalıştırırsanız, geçerli dizinde bulunan dosyaların bir listesini alırsınız.
❯ python list_dir.py example.py LICENSE list_dir.py README.mdNot: Windows kullanıyorsanız, farklı komutlar kullanmanız gerekeceğini unutmayın. Örneğin “ls” yerine “dir” kullanabilirsiniz.
Bu çok basit görünebilir ve haklısın. Kabuğun size getirdiği tüm güce tam olarak yaklaşmak istiyorsunuz. Şimdi alt süreç ile kabuğa argümanları nasıl ileteceğimizi öğrenelim.
Örneğin, gizli dosyaları (nokta ile başlayanlar) da listelemek ve ayrıca dosyaların tüm meta verilerini listelemek için aşağıdaki kodu yazıyoruz.
import subprocess # subprocess.run('ls') # Simple command subprocess.run('ls -la', shell=True)Bu komutu bir dizge olarak çalıştırıyoruz ve Shell argümanını kullanıyoruz. Bu, alt işlemimizin yürütülmesinin başlangıcında bir kabuğu çağırdığımız anlamına gelir ve komut argümanı doğrudan kabuk tarafından yorumlanır.
Ancak, shell=True kullanımının birçok dezavantajı vardır ve en kötüsü olası güvenlik sızıntılarıdır. Onlar hakkında resmi belgelerde okuyabilirsiniz.
Komutları çalıştırma işlevine iletmenin en iyi yolu, lst[0]' ın çağrılacak komut (bu durumda ls) ve lst[n]' nin bu komutun argümanları olduğu bir liste kullanmaktır.
Bunu yaparsak, kodumuz aşağıdaki gibi görünecektir.
import subprocess # subprocess.run('ls') # Simple command # subprocess.run('ls -la', shell=True) # Dangerous command subprocess.run(['ls', '-la'])Bir alt işlemin standart çıktısını bir değişkende saklamak istiyorsak, bunu yakalama_çıktı argümanını true olarak ayarlayarak yapabiliriz.
list_of_files = subprocess.run(['ls', '-la'], capture_output=True) print(list_of_files.stdout) ❯ python list_dir.py b'total 36\ndrwxr-xr-x 3 daniel daniel 4096 may 20 21:08 .\ndrwx------ 30 daniel daniel 4096 may 20 18:03 ..\n-rw-r--r-- 1 daniel daniel 55 may 20 20:18 example.py\ndrwxr-xr-x 8 daniel daniel 4096 may 20 17:31 .git\n-rw-r--r-- 1 daniel daniel 2160 may 17 22:23 .gitignore\n-rw-r--r-- 1 daniel daniel 271 may 20 19:53 internet_checker.py\n-rw-r--r-- 1 daniel daniel 1076 may 17 22:23 LICENSE\n-rw-r--r-- 1 daniel daniel 216 may 20 22:12 list_dir.py\n-rw-r--r-- 1 daniel daniel 22 may 17 22:23 README.md\n'Bir işlemin çıktısına erişmek için stdout örnek niteliğini kullanırız.
Bu durumda, çıktıyı bayt yerine bir dizge olarak saklamak istiyoruz ve bunu metin argümanını doğru olarak ayarlayarak yapabiliriz.
list_of_files = subprocess.run(['ls', '-la'], capture_output=True, text=True) print(list_of_files.stdout) ❯ python list_dir.py total 36 drwxr-xr-x 3 daniel daniel 4096 may 20 21:08 . drwx------ 30 daniel daniel 4096 may 20 18:03 .. -rw-r--r-- 1 daniel daniel 55 may 20 20:18 example.py drwxr-xr-x 8 daniel daniel 4096 may 20 17:31 .git -rw-r--r-- 1 daniel daniel 2160 may 17 22:23 .gitignore -rw-r--r-- 1 daniel daniel 271 may 20 19:53 internet_checker.py -rw-r--r-- 1 daniel daniel 1076 may 17 22:23 LICENSE -rw-r--r-- 1 daniel daniel 227 may 20 22:14 list_dir.py -rw-r--r-- 1 daniel daniel 22 may 17 22:23 README.mdMükemmel, artık alt süreç kitaplığının temellerini bildiğimize göre, bazı kullanım örneklerine geçmenin zamanı geldi.
Python'da alt işlemin Kullanım Örnekleri
Bu bölümde, alt süreç kitaplığının bazı pratik kullanımlarını gözden geçireceğiz. Hepsini bu Github deposunda kontrol edebilirsiniz.
Program denetleyicisi
Bu kitaplığın ana kullanımlarından biri, basit işletim sistemi işlemleri yapabilme yeteneğidir.
Örneğin, bir programın kurulu olup olmadığını kontrol eden basit bir komut dosyası. Linux'ta bunu hangi komutla yapabiliriz.

'''Program checker with subprocess''' import subprocess program = 'git' process = subprocess. run(['which', program], capture_output=True, text=True) if process.returncode == 0: print(f'The program "{program}" is installed') print(f'The location of the binary is: {process.stdout}') else: print(f'Sorry the {program} is not installed') print(process.stderr)Not: UNIX'te bir komut başarılı olduğunda durum kodu 0'dır. Aksi takdirde, yürütme sırasında bir şeyler ters gitti.
Shell=True argümanını kullanmadığımız için kullanıcı girdisini güvenli bir şekilde alabiliriz. Ayrıca, girdinin regex desenli geçerli bir program olup olmadığını kontrol edebiliriz.
import subprocess import re programs = input('Separe the programs with a space: ').split() secure_pattern = '[\w\d]' for program in programs: if not re.match(secure_pattern, program): print("Sorry we can't check that program") continue process = subprocess. run( ['which', program], capture_output=True, text=True) if process.returncode == 0: print(f'The program "{program}" is installed') print(f'The location of the binary is: {process.stdout}') else: print(f'Sorry the {program} is not installed') print(process.stderr) print('\n')Bu durumda, programları kullanıcıdan alıyoruz ve program dizesini yalnızca harf ve rakamlardan oluşan bir regex ifadesi kullanıyoruz. Her programın varlığını bir for döngüsü ile kontrol ediyoruz.
Python'da Basit Grep
Arkadaşınız Tom'un bir metin dosyasında kalıpların bir listesi ve her kalıp için eşleşme sayısını almak istediği başka bir büyük dosya var. Her kalıp için grep komutunu çalıştırmak için saatler harcardı.
Neyse ki, Python ile bu sorunu nasıl çözeceğinizi biliyorsunuz ve bu görevi birkaç saniye içinde yapmasına yardım edeceksiniz.
import subprocess patterns_file = 'patterns.txt' readfile = 'romeo-full.txt' with open(patterns_file, 'r') as f: for pattern in f: pattern = pattern.strip() process = subprocess.run( ['grep', '-c', f'{pattern}', readfile], capture_output=True, text=True) if int(process.stdout) == 0: print( f'The pattern "{pattern}" did not match any line of {readfile}') continue print(f'The pattern "{pattern}" matched {process.stdout.strip()} times')Bu dosyaya bir göz atarak, çalışmak istediğimiz dosya isimleri olan iki değişken tanımlıyoruz. Ardından tüm kalıpları içeren dosyayı açıp üzerlerinde yineleme yapıyoruz. Ardından, “-c” bayrağı (sayım anlamına gelir) ile grep komutu çalıştıran bir alt işlemi çağırıyoruz ve bir koşullu ile eşleşmenin çıktısını belirliyoruz.
Bu dosyayı çalıştırırsanız (metin dosyalarını Github deposundan indirebileceğinizi unutmayın)
Alt işlemli bir sanalenv kurun
Python ile yapabileceğiniz en havalı şeylerden biri süreç otomasyonudur. Bu tür bir komut dosyası size haftada saatlerce zaman kazandırabilir.
Örneğin, bizim için sanal bir ortam oluşturan ve tüm bağımlılıkları yüklemek için geçerli dizinde bir gereksinim.txt dosyası bulmaya çalışan bir kurulum komut dosyası oluşturacağız.
import subprocess from pathlib import Path VENV_NAME = '.venv' REQUIREMENTS = 'requirements.txt' process1 = subprocess.run(['which', 'python3'], capture_output=True, text=True) if process1.returncode != 0: raise OSError('Sorry python3 is not installed') python_bin = process1.stdout.strip() print(f'Python found in: {python_bin}') process2 = subprocess.run('echo "$SHELL"', shell=True, capture_output=True, text=True) shell_bin = process2.stdout.split('/')[-1] create_venv = subprocess.run([python_bin, '-m', 'venv', VENV_NAME], check=True) if create_venv.returncode == 0: print(f'Your venv {VENV_NAME} has been created') pip_bin = f'{VENV_NAME}/bin/pip3' if Path(REQUIREMENTS).exists(): print(f'Requirements file "{REQUIREMENTS}" found') print('Installing requirements') subprocess.run([pip_bin, 'install', '-r', REQUIREMENTS]) print('Process completed! Now activate your environment with "source .venv/bin/activate"') else: print("No requirements specified ...")Bu durumda, birden fazla işlem kullanıyoruz ve ihtiyacımız olan verileri python betiğimizde ayrıştırıyoruz. Ayrıca, gereksinimler.txt dosyasının mevcut olup olmadığını anlamamızı sağlayan pathlib kitaplığını da kullanıyoruz.
Python dosyasını çalıştırırsanız, işletim sisteminde neler olduğuna dair bazı yararlı mesajlar alırsınız.
❯ python setup.py Python found in: /usr/bin/python3 Your venv .venv has been created Requirements file "requirements.txt" found Installing requirements Collecting asgiref==3.3.4 ....... Process completed! Now activate your environment with "source .venv/bin/activate"Standart çıktıyı bir değişkene yönlendirmediğimiz için çıktıyı yükleme işleminden aldığımızı unutmayın.
Başka bir Programlama Dili çalıştırın
Python ile diğer programlama dillerini çalıştırabilir ve bu dosyalardan çıktı alabiliriz. Bu mümkündür, çünkü alt süreçler doğrudan işletim sistemi ile etkileşime girer.
Örneğin, C++ ve Java'da bir merhaba dünya programı oluşturalım. Aşağıdaki dosyayı çalıştırmak için C++ ve Java derleyicilerini yüklemeniz gerekir.
merhabadünya.cpp
#include <iostream> int main(){ std::cout << "This is a hello world in C++" << std::endl; return 0; }
merhabadünya.java
class HelloWorld{ public static void main(String args[]){ System.out.println("This is a hello world in Java"); } }
Bunun basit bir Python tek-astarına kıyasla çok fazla kod gibi göründüğünü biliyorum, ancak bu sadece test amaçlı.
Bir dizindeki tüm C++ ve Java dosyalarını çalıştıran bir Python betiği oluşturacağız. Bunu yapmak için önce dosya uzantısına bağlı olarak bir dosya listesi almak istiyoruz ve glob bunu kolayca yapmamızı sağlıyor!
from glob import glob # Gets files with each extension java_files = glob('*.java') cpp_files = glob('*.cpp')Bundan sonra, her dosya türünü yürütmek için alt işlemleri kullanmaya başlayabiliriz.
for file in cpp_files: process = subprocess.run(f'g++ {file} -o out; ./out', shell=True, capture_output=True, text=True) output = process.stdout.strip() + ' BTW this was runned by Python' print(output) for file in java_files: without_ext = file.strip('.java') process = subprocess.run(f'java {file}; java {without_ext}',shell=True, capture_output=True, text=True) output = process.stdout.strip() + ' A Python subprocess runned this :)' print(output)Küçük bir numara, çıktıyı değiştirmek ve yalnızca ihtiyacımız olanı almak için string işlev şeridini kullanmaktır.
Not: Çıktılarını belleğe yüklediğimizden ve bu bir bellek sızıntısına neden olabileceğinden, büyük Java veya C++ dosyalarını çalıştırırken dikkatli olun.
Harici programları aç
Yalnızca bir alt işlem aracılığıyla ikili dosya konumlarını çağırarak diğer programları çalıştırabiliriz.
Tercih ettiğim web tarayıcısı cesur açarak deneyelim.
import subprocess subprocess.run('brave')Bu, bir tarayıcı örneği veya zaten tarayıcıyı çalıştırıyorsanız başka bir sekme açacaktır.

Bayrakları kabul eden diğer tüm programlarda olduğu gibi, istenen davranışı üretmek için bunları kullanabiliriz.
import subprocess subprocess.run(['brave', '--incognito']) 
Sonuç olarak
Bir alt süreç, başka bir süreç tarafından oluşturulan bir bilgisayar sürecidir. htop ve görev yöneticisi gibi araçlarla bilgisayarımızın çalıştığı işlemleri kontrol edebiliriz.
Python'un alt süreçlerle çalışmak için kendi kütüphanesi vardır. Şu anda, çalıştırma işlevi bize alt süreçleri oluşturmak ve yönetmek için basit bir arayüz sağlar.
Doğrudan işletim sistemi ile etkileşimde bulunduğumuz için onlarla her türlü uygulamayı oluşturabiliriz.
Son olarak, öğrenmenin en iyi yolunun kullanmak istediğiniz bir şey yaratmak olduğunu unutmayın.
