目次
1. Mis on Pythoni subprocess moodul?
Ülevaade
Pythonisubprocess moodul on võimas tööriist süsteemikäskude ja väliste programmide käivitamiseks Pythonist. Selle mooduli abil saab hallata standardset sisendit/väljundit ja protsesse, mis lihtsustab Pythoni programmide ja väliste tööriistade integreerimist. See pakub turvalisemat ja paindlikumat protsessihaldust võrreldes vanemate meetoditega, nagu os.system() ja commands moodul.Peamised kasutusviisid
- Käsurea käskude käivitamine: Lihtsate süsteemikäskude täitmine.
- Protsesside haldus: Väliste programmide käivitamine ja standardsete sisend/väljundvoogude suunamine.
- Asünkroonne töötlus: Pikaajaliste või paralleelselt töötavate ülesannete käitlemine.
Ad
2. Põhiline kasutus: subprocess.run()
Põhiline kasutusviis
subprocess.run() funktsioon võimaldab süsteemikäsklusi lihtsalt Pythonis käivitada. Näiteks, et kuvada kataloogi faile:import subprocess
result = subprocess.run(['ls', '-l'], capture_output=True, text=True)
print(result.stdout)See kood käivitab käsu ls -l, salvestab väljundi stdout muutujasse ja võimaldab Pythonis tulemust töödelda. capture_output=True salvestab väljundi ning text=True muudab tulemuse stringiks.Veahaldus
Kui kasutadsubprocess.run() ja käsk ebaõnnestub, saad veateate kätte stderr kaudu ning edukuse kontrollimiseks saab kasutada returncode muutujat.result = subprocess.run(['ls', 'nonexistentfile'], capture_output=True, text=True)
if result.returncode != 0:
print(f"Viga: {result.stderr}")Selles näites, kui faili pole olemas, kuvatakse veateade standardveaväljundis.
3. Asünkroonne täitmine: subprocess.Popen()
Asünkroonne töötlus Popen abil
subprocess.run() on sünkroonne (programm ootab käsu lõppu), kuid subprocess.Popen() võimaldab protsessi käivitada asünkroonselt – muud tööd saavad paralleelselt jätkuda.import subprocess
proc = subprocess.Popen(['sleep', '5'], stdout=subprocess.PIPE)
print("Protsess on käivitatud")
proc.wait()
print("Protsess on lõppenud")See kood käivitab sleep 5 asünkroonselt, võimaldades muud tegevust samaaegselt.Standard sisend/väljundi haldus
Popen võimaldab täpselt kontrollida standardset sisendit ja väljundit. Näiteks järgmine kood loeb andmed failist, töötleb need cat käsuga ja salvestab teise faili:with open('input.txt', 'r') as infile, open('output.txt', 'w') as outfile:
proc = subprocess.Popen(['cat'], stdin=infile, stdout=outfile)
proc.wait()Nii saab suunata sisendi/väljundi failidesse väliste käskude töötlemisel.Ad
4. Kasutusnäide: automatiseeritud skriptid
Failide varundamine
Süsteemihalduse või korduvate ülesannete automatiseerimiseks onsubprocess väga kasulik. Näiteks järgmine skript kopeerib failid automaatselt varunduskausta:import subprocess
files_to_backup = ['file1.txt', 'file2.txt', 'file3.txt']
backup_dir = '/backup/directory/'
for file in files_to_backup:
subprocess.run(['cp', file, backup_dir])See kood kopeerib määratud failid varunduskataloogi, võimaldades regulaarset varundust automatiseerida.Kasutus CI/CD torujuhtmes
subprocess on laialdaselt kasutusel pidevas integreerimises (CI) ja pidevas juurutamises (CD) – näiteks testskriptide automaatsel käivitamisel või juurutamisprotsessi osana. Näiteks saab automaatselt käivitada testid ja jätkata järgmise sammuga ainult õnnestumise korral.
5. Turvalisus ja parimad tavad
shell=True riskid
shell=True võimaldab käsklusi käivitada shelli kaudu, kuid sellega kaasnevad turvariskid. Eriti ohtlik on anda shellile väliseid kasutajasisendeid, kuna see võib viia shell-injection rünnakuteni. shell=False kasutamine vähendab seda riski.import subprocess
# Soovitatav (turvaline) kasutusviis
subprocess.run(['ls', '-l'])
# shell=True (vajab ettevaatust)
subprocess.run('ls -l', shell=True)Platvormiülene kasutus
Süsteemikäsud võivad erineda erinevatel operatsioonisüsteemidel. Näiteks võib kasutada Pythoniplatform moodulit, et valida käsk OS-i alusel:import platform
import subprocess
if platform.system() == "Windows":
subprocess.run(['dir'], shell=True)
else:
subprocess.run(['ls', '-l'])Ad
6. Tõrkeotsing ja silumine
Levinumad vead ja lahendused
subprocess kasutamisel võib tihti esineda vigu, nagu failide puudumine või ligipääsuõigused. Sellised vead saab tuvastada stderr ja returncode abil.Nõuanded silumiseks
check=True argument põhjustab käsu nurjumisel erindi, võimaldades probleemidest kiiresti teada saada. Standardväljundi ja veateadete logimine teeb silumise lihtsamaks.import subprocess
try:
result = subprocess.run(['ls', '-l'], check=True, capture_output=True, text=True)
print(result.stdout)
except subprocess.CalledProcessError as e:
print(f"Tekkis viga: {e}")Ad
7. Asünkroonne töötlus ja koostöö asyncio-ga
Asünkroonne töötlus asyncio abil
asyncio võimaldab subprocess mooduliga paralleelselt mitut protsessi asünkroonselt töödelda. Järgnevas näites kasutatakse asyncio-d, et käivitada ls käsk ja töödelda tulemust:import asyncio
import subprocess
async def run_command():
proc = await asyncio.create_subprocess_exec('ls', '-l',
stdout=asyncio.subprocess.PIPE,
stderr=asyncio.subprocess.PIPE)
stdout, stderr = await proc.communicate()
if stdout:
print(f'[stdout]n{stdout.decode()}')
if stderr:
print(f'[stderr]n{stderr.decode()}')
asyncio.run(run_command())See kood käivitab käsu asünkroonselt ja töötleb tulemused (stdout/stderr). asyncio võimaldab tõhusalt hallata paralleelseid ülesandeid.

