timeout auf Teilprozess in python readline
Ich habe ein kleines Problem, ich bin mir nicht ganz sicher, wie Sie Sie zu lösen. Hier ist ein minimal-Beispiel:
Was ich habe,
scan_process = subprocess.Popen(command, stdout=subprocess.PIPE, stderr=subprocess.STDOUT)
while(some_criterium):
line = scan_process.stdout.readline()
some_criterium = do_something(line)
Was ich möchte
scan_process = subprocess.Popen(command, stdout=subprocess.PIPE, stderr=subprocess.STDOUT)
while(some_criterium):
line = scan_process.stdout.readline()
if nothing_happens_after_10s:
break
else:
some_criterium = do_something(line)
Lese ich eine Zeile aus einem Teilprozess und tun etwas mit ihm. Was ich will, ist zu beenden, wenn keine Linie kam nach einem festen Zeitintervall. Irgendwelche Empfehlungen?
InformationsquelleAutor der Frage Tom | 2012-05-25
Du musst angemeldet sein, um einen Kommentar abzugeben.
Danke für die vielen Antworten!
Ich habe einen Weg gefunden mein problem zu lösen, indem Sie einfach die wählen Sie mit.Umfrage, um einen Blick in die Standardausgabe.
InformationsquelleAutor der Antwort Tom
Hier eine tragbare Lösung, erzwingt das timeout für das Lesen einer einzigen Zeile mit
asyncio
:InformationsquelleAutor der Antwort jfs
Benutzte ich etwas, das mehr allgemein in python (IIRC auch zusammengebastelt aus SO Fragen, aber ich weiß nicht mehr welche).
Seien Sie gewarnt, obwohl, es verwendet einen interrupt zu stoppen, was auch immer Funktion, die es Ihnen. Könnte dies nicht eine gute Idee für alle Funktionen und es auch verhindert, dass Sie schließen das Programm mit Strg+c während des timeout (also Strg+c wird behandelt wie ein timeout)
Sie könnte diese eine nennen mag:
Vielleicht ein bisschen übertrieben, aber. Ich vermute, es gibt eine einfachere option für Ihren Fall, weiß ich nicht.
InformationsquelleAutor der Antwort Flogo
In Python 3 ist, wird eine timeout-option wurde Hinzugefügt, mit dem subprocess-Modul. Mit einer Struktur wie
wäre eine richtige Lösung.
Seit der Ausgabe enthalten soll eine neue-Zeile-Zeichen, ist es sicher davon ausgehen, dass es text (wie in der druckbar, lesbar ist), in dem Fall
universal_newlines=True
flag wird dringend empfohlen.Wenn Python2 ist ein muss, verwenden Sie bitte https://pypi.python.org/pypi/subprocess32/ (backport)
Für eine pure-python Python-2-Lösung, Blick auf Mit Modul 'subprocess' mit timeout.
InformationsquelleAutor der Antwort Jan-Philip Gehrcke
Versuchen Sie signal.alarm:
Ein paar Durchläufe, um zu zeigen, dass es geht:
Weitere detaillierte Beispiele finden Sie unter pGuides.
InformationsquelleAutor der Antwort AXE-Labs
Tragbare Lösung ist die Verwendung eines thread zu töten, der Kind-Prozess, wenn eine Zeile zu Lesen dauert zu lange:
wo
WatchdogTimer
Klasse ist wiethreading.Timer
erneut gestartet werden können und/oder gesperrt:InformationsquelleAutor der Antwort jfs
während Ihr (Tom ' s) Lösung, die funktioniert, mit
select()
imC
idiom ist kompakter. dies ist das äquivalent von Ihre Antwortden rest ist das gleiche.
sehen
pydoc select.select
.[Hinweis: dies ist Unix-spezifisch, da sind einige der anderen Antworten.]
[Anmerkung 2: bearbeitet, um hinzufügen Zeile Pufferung als pro OP-Anfrage]
[Anmerkung 3: die Zeile Pufferung können nicht zuverlässig in allen Situationen, was zu readline() blockiert]
InformationsquelleAutor der Antwort jcomeau_ictx