subprocess.Popen: communicate(), wait() și poll() în Python

Procese (subprocess) Python 3.0+ (context manager: 3.2+)

Pornește un program și îl controlează în timp ce rulează: date de intrare, ieșire pe bucăți, așteptare.

Sintaxă
with subprocess.Popen(argumente, stdin=PIPE, stdout=PIPE, text=True) as p:
    iesire, erori = p.communicate(input, timeout)
p.wait(timeout) / p.poll()

Ce face subprocess.Popen: communicate(), wait() și poll()

Popen pornește programul și returnează imediat, fără să aștepte. Cu stdout=subprocess.PIPE poți citi ieșirea pe măsură ce apare (de exemplu rând cu rând dintr-un proces lung), iar cu stdin=subprocess.PIPE îi trimiți date.

communicate(input) trimite datele, citește toată ieșirea și așteaptă terminarea, evitând blocajele care apar când citești și scrii manual. wait() așteaptă terminarea și returnează codul de ieșire; poll() doar verifică: returnează None dacă programul încă rulează. Atributele utile: pid, returncode, args.

Parametri

Parametru Descriere
argumente Programul și argumentele.
stdin, stdout, stderr PIPE, DEVNULL, STDOUT sau un fișier.
text Lucrează cu texte în loc de bytes.

Ce returnează

Un obiect subprocess.Popen.

Exemple

Exemplul 1: Ieșire citită pe măsură ce apare

import subprocess, sys
cod = "import time\nfor i in range(3):\n    print('pas', i, flush=True)\n    time.sleep(0.1)"
with subprocess.Popen([sys.executable, "-c", cod], stdout=subprocess.PIPE, text=True) as p:
    print("rulează:", p.poll() is None)
    for rand in p.stdout:
        print("primit:", rand.strip())
print("cod de ieșire:", p.wait(), p.returncode)

Rezultat

rulează: True
primit: pas 0
primit: pas 1
primit: pas 2
cod de ieșire: 0 0

Exemplul 2: communicate() cu date de intrare

import subprocess
p = subprocess.Popen(["sort"], stdin=subprocess.PIPE, stdout=subprocess.PIPE, text=True)
iesire, _ = p.communicate("pere\nmere\ncaise\n", timeout=5)
print(iesire.split(), p.returncode)

Rezultat

['caise', 'mere', 'pere'] 0

Greșeli frecvente

  • Scrii mult în p.stdin și apoi citești din p.stdout: dacă tamponul de ieșire se umple, ambele procese se blochează. Folosește communicate().

Comenzi înrudite