Heim >Backend-Entwicklung >Python-Tutorial >Wie kann ich verhindern, dass Python-Programme beim Erfassen kontinuierlicher Prozessausgaben hängen bleiben?

Wie kann ich verhindern, dass Python-Programme beim Erfassen kontinuierlicher Prozessausgaben hängen bleiben?

Susan Sarandon
Susan SarandonOriginal
2024-10-29 18:19:09900Durchsuche

How Can I Prevent Python Programs from Hanging When Capturing Continuous Process Output?

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

  • Temporäre Datei: Speichern Sie die Prozessausgabe vorübergehend in einer Datei und lesen Sie sie nach Abschluss des Prozesses getötet.
  • Regelmäßige Abfrage:Lesen Sie die Ausgabe regelmäßig in einer Schleife, bis der Prozess beendet ist.
  • Nicht blockierender Ausgabestream:Verwenden Sie a Bibliothek, die nicht blockierende Ausgabestreams unterstützt, um Hänger zu vermeiden.

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!

Stellungnahme:
Der Inhalt dieses Artikels wird freiwillig von Internetnutzern beigesteuert und das Urheberrecht liegt beim ursprünglichen Autor. Diese Website übernimmt keine entsprechende rechtliche Verantwortung. Wenn Sie Inhalte finden, bei denen der Verdacht eines Plagiats oder einer Rechtsverletzung besteht, wenden Sie sich bitte an admin@php.cn