Beim Versuch, die Ausgabe eines sich ständig aktualisierenden Prozesses in Python zu lesen, kann es zu Problemen beim Einfrieren kommen. Dieses Problem tritt insbesondere bei Verwendung der readlines()-Methode auf.
Im bereitgestellten Code-Snippet ist der Prozess = os.popen("top"). Die Zeile readlines() führt dazu, dass das Programm hängen bleibt. Dies liegt daran, dass readlines() die gesamte Ausgabe des Unterprozesses auf einmal liest, was umfangreich sein und zu einem langen Blockierungsvorgang führen kann.
Ein besserer Ansatz ist um die Funktion subprocess.Popen() zu verwenden, um einen Unterprozess zu erstellen und seine Eingabe und Ausgabe zu verwalten. So können Sie es machen:
<code class="python">import subprocess process = subprocess.Popen('top') time.sleep(2) os.popen("killall top") print process</code>
Dieser Code verwendet Popen(), um einen Unterprozess zu erstellen, der oben ausgeführt wird. Nach einer Wartezeit von 2 Sekunden wird der oberste Prozess beendet und schließlich das Unterprozessobjekt gedruckt. Allerdings gibt dieser Ansatz immer noch ein unformatiertes Objekt zurück.
Um die Ausgabe des Unterprozesses zu lesen, ohne das Programm zu blockieren, können Sie eine temporäre Datei zum Speichern der Ausgabe verwenden. Hier ist eine verbesserte Version des Codes:
<code class="python">#!/usr/bin/env python import subprocess import tempfile import time def main(): # Create a temporary file to store the subprocess output f = tempfile.TemporaryFile() # Start the subprocess and redirect its stdout to the temporary file process = subprocess.Popen(["top"], stdout=f) # Wait for a few seconds time.sleep(2) # Kill the subprocess process.terminate() process.wait() # Seek to the start of the temporary file and read the output f.seek(0) output = f.read() # Close the temporary file f.close() # Print the output of the subprocess print(output) if __name__=="__main__": main()</code>
Diese Lösung stellt sicher, dass das Programm beim Lesen der Ausgabe des Unterprozesses nicht hängen bleibt. Die Methode subprocess.wait() wartet auf die Beendigung des Unterprozesses und stellt so sicher, dass die gesamte Ausgabe in die Datei geschrieben wurde, bevor auf sie zugegriffen wird.
Das obige ist der detaillierte Inhalt vonWie kann verhindert werden, dass Python beim Lesen der Ausgabe eines sich ständig aktualisierenden Prozesses einfriert?. Für weitere Informationen folgen Sie bitte anderen verwandten Artikeln auf der PHP chinesischen Website!