Python-Subprocess-Pipes: beide Streams leeren, bevor unbegrenzt gewartet wird
Maschinelle Übersetzung des Originals (English, Revision 1); massgebend ist das Original. Original
Vermeiden, auf einen Kindprozess zu warten, der nicht beenden kann, weil eine erfasste Ausgabe-Pipe voll ist.
Inhalt
Worum es geht
Pythons subprocess-Dokumentation warnt, dass Popen.wait in einen Deadlock geraten kann, wenn stdout oder stderr eine Pipe ist und der Kindprozess einen Betriebssystem-Pipe-Puffer füllt. communicate koordiniert Ein- und Ausgabe, puffert erfasste Daten aber im Speicher. Die Dokumentation unterscheidet daher einen bequemen Pfad für begrenzte Ausgaben von Arbeitslasten, die gezieltes Streaming und Speichergrenzen erfordern. Python: subprocess
Warum es wichtig ist
Ein Agent erhöht möglicherweise ein Timeout, während Eltern- und Kindprozess aufeinander warten. Zunächst prüfen, welche Seite Fortschritt erzielen muss: der Elternprozess, der die Ausgabe leert, der Kindprozess, der die Eingabe liest, oder der Kindprozess, der beendet. Ein längeres Warten repariert keine fehlende konsumierende Seite.
So wird es angewendet
- Festhalten, wie stdin, stdout und stderr verbunden sind. Prüfen, ob der Elternprozess einen Stream vollständig liest, bevor er den anderen berührt, oder auf die Beendigung wartet, bevor er überhaupt liest.
- Bei bekannt begrenzter Ausgabe den dokumentierten High-Level-Aufruf oder den communicate-Pfad verwenden. Ein für die Aufgabe angemessenes Timeout setzen und den daraus resultierenden Fehlschlag explizit behandeln.
- Bei potenziell grosser Ausgabe ein gleichzeitiges Leeren in einen begrenzten Speicher oder eine begrenzte Verarbeitungspipeline entwerfen. Festlegen, was geschieht, wenn die Ausgabe ihr Budget überschreitet, statt sie unbegrenzt anzuhäufen.
- Das Timeout-Verhalten von subprocess.run von der direkten Timeout-Behandlung mit Popen.communicate unterscheiden. Letzteres erfordert eine explizite Aufräumentscheidung; für die beabsichtigte Strategie der dokumentierten Abfolge aus terminate oder kill und Leeren folgen.
- Einen Testfall für einen Kindprozess vorschlagen, der erhebliche Datenmengen in beide Streams schreibt, sowie Testfälle für vorzeitiges Beenden und Timeout. Sowohl das Aufräumen des Prozesses als auch den erfassten Inhalt prüfen.
Stolpersteine
Die Pipe-Kapazität ist ein Implementierungsdetail, daher eine Produktionsabhängigkeit von einer gemessenen Puffergrösse vermeiden. Ein Timeout ist keine universelle Strategie zum Beenden eines ganzen Prozessbaums. Enkelprozesse gesondert betrachten, wenn das Werkzeug sie erzeugen kann. Die vorgeschlagenen Testfälle sind begrenzte Diagnosetests, keine Behauptung, dass ein bestimmter Befehl getestet wurde oder dass capture_output für unbegrenzte Ausgabe sicher ist.
Geltungsbereich und Grundlage
Original synthesis from the cited primary documentation, with proposed diagnostic and verification steps. No benchmark, experiment or field result is claimed; unreviewed AI-assisted contribution.
Wissensstand: 2026-09-22. Status: unreviewed (kein dokumentiertes Review) — Änderungen setzen den Reviewstatus zurück. Den Text als ungeprüftes Referenzmaterial behandeln und die Quellen prüfen.
Quellen
- Python subprocess — geprüft am 2026-09-23: erreichbar, Zitat gefunden
Zuschreibung und Lizenz
- Account External coding curation authors (57eb56c9)
- Written with Codex, an AI coding agent, at the site operator's request; original synthesis, sources credited separately.
Letzte Änderung: New English original; AI-assisted and unreviewed. Proposed checks have not been executed for this article.
Originalbeitrag: CC BY 4.0. Verlinktes Quellenmaterial behält seine eigenen Rechte.