Ce face subprocess.run()
run(["git", "status"]) rulează programul și returnează un obiect CompletedProcess cu returncode, stdout și stderr. Cu capture_output=True ieșirea este capturată în loc să apară pe ecran, iar cu text=True o primești ca text, nu ca bytes.
check=True aruncă CalledProcessError dacă programul se termină cu cod nenul (ca și metoda check_returncode() a rezultatului). timeout oprește programul după un număr de secunde (TimeoutExpired). input trimite date la intrarea standard; cwd și env aleg directorul și mediul.
Dă argumentele ca listă, fără shell=True: astfel textele cu spații sau caractere speciale nu pot fi interpretate de shell (injecție de comenzi).
Parametri
| Parametru | Descriere |
|---|---|
argumente |
Lista cu programul și argumentele lui. |
capture_output, text |
Capturează ieșirea, ca text. |
check |
Eroare la cod de ieșire nenul. |
timeout, input, cwd, env |
Limită de timp, date de intrare, director, mediu. |
Ce returnează
Un obiect subprocess.CompletedProcess.
Exemple
Exemplul 1: Capturarea ieșirii
import subprocess, sys
r = subprocess.run(["echo", "Salut", "Iași"], capture_output=True, text=True)
print(repr(r.stdout), r.returncode)
r = subprocess.run([sys.executable, "-c", "import sys; print(sys.stdin.read().upper())"],
input="text trimis", capture_output=True, text=True)
print(r.stdout.strip(), type(r).__name__, r.args[0] == sys.executable)
Rezultat
'Salut Iași\n' 0
TEXT TRIMIS CompletedProcess True
Exemplul 2: Erori, check și timeout
import subprocess, sys
r = subprocess.run(["ls", "fisier_inexistent"], capture_output=True, text=True)
print(r.returncode != 0, bool(r.stderr))
try:
r.check_returncode()
except subprocess.CalledProcessError as e:
print("CalledProcessError, cod", e.returncode != 0)
try:
subprocess.run([sys.executable, "-c", "import time; time.sleep(5)"], timeout=0.5)
except subprocess.TimeoutExpired as e:
print("Oprit după", e.timeout, "secunde")
r = subprocess.CompletedProcess(["x"], 0, "ok\n")
print(r.check_returncode(), r)
Rezultat
True True
CalledProcessError, cod True
Oprit după 0.5 secunde
None CompletedProcess(args=['x'], returncode=0, stdout='ok\n')
Greșeli frecvente
- Dai comanda ca un singur text fără
shell=True:run("ls -l")caută un program numit „ls -l” și dăFileNotFoundError. Folosește["ls", "-l"]. - Folosești
shell=Truecu date venite de la utilizator; un nume caa; rm -rf ~rulează și a doua comandă.
Comenzi înrudite
subprocess.Popen: communicate(), wait() și poll(): Pornește un program și îl controlează în timp ce rulează: date de intrare, ieșire pe bucăți, așteptare.subprocess.check_output(), check_call() și call(): Funcții mai vechi și mai scurte pentru rularea unui program: ieșirea, verificarea sau doar codul.shutil.which(): Găsește calea completă a unui program din PATH, ca comanda which din terminal.os.system() și os.popen(): Rulează o comandă în shell; variantele vechi, înlocuite de modulul subprocess.