subprocess.run() în Python

Procese (subprocess) Python 3.5+ (capture_output, text: 3.7+)

Pornește un program extern, așteaptă să se termine și îi returnează rezultatul.

Sintaxă
subprocess.run(argumente, *, capture_output=False, text=False, check=False, timeout=None, input=None, cwd=None, env=None)

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=True cu date venite de la utilizator; un nume ca a; rm -rf ~ rulează și a doua comandă.

Comenzi înrudite