Heim >Backend-Entwicklung >Python-Tutorial >Wie kann ich verhindern, dass Python-Programme beim Erfassen kontinuierlicher Prozessausgaben hängen bleiben?
Beenden Sie das Lesen der Prozessausgabe in Python ohne Hänger
Bei Verwendung von os.popen() zum Erfassen der Prozessausgabe kann das Programm hängen bleiben, wenn die Der Prozess gibt kontinuierlich Daten aus. Um dieses Problem zu beheben, sollten Sie alternative Methoden in Betracht ziehen, wie zum Beispiel:
Verwendung von Subprozessen und Threads
Starten Sie den Prozess mit subprocess.Popen, erstellen Sie einen Thread, um die Ausgabe zu lesen, und speichern Sie es in einer Warteschlange. Beenden Sie den Prozess nach einer bestimmten Zeitüberschreitung.
<code class="python">import subprocess import threading import time def read_output(process, append): for line in iter(process.stdout.readline, ""): append(line) def main(): process = subprocess.Popen(["top"], stdout=subprocess.PIPE, close_fds=True) try: q = collections.deque(maxlen=200) t = threading.Thread(target=read_output, args=(process, q.append)) t.daemon = True t.start() time.sleep(2) finally: process.terminate() print(''.join(q))</code>
Verwenden des Signalhandlers
Verwenden Sie signal.alarm(), um nach einer bestimmten Zeitüberschreitung eine Ausnahme auszulösen. Dadurch wird die Beendigung des Prozesses erzwungen, sodass die Ausgabe erfasst werden kann.
<code class="python">import signal import subprocess import time def alarm_handler(signum, frame): raise Alarm def main(): process = subprocess.Popen(["top"], stdout=subprocess.PIPE, close_fds=True) signal.signal(signal.SIGALRM, alarm_handler) signal.alarm(2) q = collections.deque(maxlen=200) try: for line in iter(process.stdout.readline, ""): q.append(line) signal.alarm(0) except Alarm: process.terminate() finally: print(''.join(q))</code>
Timer verwenden
Verwenden Sie Threading.Timer, um den Prozess nach einer Zeitüberschreitung zu beenden.
<code class="python">import threading import subprocess def main(): process = subprocess.Popen(["top"], stdout=subprocess.PIPE, close_fds=True) timer = threading.Timer(2, process.terminate) timer.start() q = collections.deque(process.stdout, maxlen=200) timer.cancel() print(''.join(q))</code>
Alternative Ansätze
Beachten Sie, dass diese Lösungen zu zusätzlicher Komplexität oder Kompatibilitätsproblemen führen können. Wählen Sie den Ansatz, der Ihren spezifischen Anforderungen und Ihrer Plattform am besten entspricht.
Das obige ist der detaillierte Inhalt vonWie kann ich verhindern, dass Python-Programme beim Erfassen kontinuierlicher Prozessausgaben hängen bleiben?. Für weitere Informationen folgen Sie bitte anderen verwandten Artikeln auf der PHP chinesischen Website!