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 dinp.stdout: dacă tamponul de ieșire se umple, ambele procese se blochează. Foloseștecommunicate().
Comenzi înrudite
subprocess.run(): Pornește un program extern, așteaptă să se termine și îi returnează rezultatul.Popen.terminate(), kill() și send_signal(): Opresc un proces pornit cu Popen sau îi trimit un semnal.os.pipe(): Creează o „țeavă” anonimă: ce scrii la un capăt citești la celălalt.