12 Stimmen

Wie kann ich die stdout-Ausgabe eines Kindprozesses erfassen?

Ich versuche, ein Programm in Python zu schreiben, und werde aufgefordert, eine .exe-Datei auszuführen. Wenn diese .exe-Datei ausgeführt wird, spuckt sie eine Menge Daten aus, und ich muss eine bestimmte Zeile auf dem Bildschirm ausgeben. Ich bin mir ziemlich sicher, dass ich Folgendes verwenden muss subprocess.popen oder etwas Ähnliches, aber ich bin neu bei subprocess und habe keine Ahnung. Hat jemand eine einfache Möglichkeit für mich, dies zu tun?

28voto

Nadia Alramli Punkte 105256

Die Lösung von @Paolo ist ideal, wenn Sie die Ausgabe nach Abschluss des Prozesses drucken möchten. Wenn Sie die Ausgabe abfragen wollen, während der Prozess läuft, müssen Sie es auf diese Weise tun:

process = subprocess.Popen(cmd, stdout=subprocess.PIPE)

while True:
    out = process.stdout.readline(1)
    if out == '' and process.poll() != None:
        break
    if out.startswith('myline'):
        sys.stdout.write(out)
        sys.stdout.flush()

1 Stimmen

Was ist myline hier?

0 Stimmen

Der OP sagte "Ich möchte eine bestimmte Zeile auf dem Bildschirm ausdrucken". , myline war nur ein Beispiel. In diesem Teil des Codes würde man die zu druckende Ausgabezeile identifizieren.

22voto

Paolo Bergantino Punkte 465120

Etwa so:

import subprocess
process = subprocess.Popen(["yourcommand"], stdout=subprocess.PIPE)
result = process.communicate()[0]

0 Stimmen

Wie würde ich eine bestimmte Zeile auslesen? ist das, wo die 0 ist? Und ja, ich bin daran interessiert, die Ausgabe zu drucken, nachdem der Prozess beendet ist. Auch wo Sie "yourcommand" haben, gehört die exe-Erweiterung dorthin?

1 Stimmen

"result" ist die gesamte Ausgabe von "yourcommand". Sie können dann diese Zeichenkette (oder Bytes-Objekt, in Py3.0) verarbeiten, um die gesuchte Zeile zu finden.

3 Stimmen

Die [0] steht für das erste Element des zurückgegebenen Tupels (stdout, stderr); Sie können das Ergebnis, das eine Zeichenkette sein wird, nach Belieben verarbeiten, z.B. um eine bestimmte Zeile zu finden. "yourcommand" ist Ihr vollständiger Befehl, eventuell ein vollständiger Pfad zu einem Befehl, wenn der Befehl nicht auf dem Weg (zumindest unter *nix).

CodeJaeger.com

CodeJaeger ist eine Gemeinschaft für Programmierer, die täglich Hilfe erhalten..
Wir haben viele Inhalte, und Sie können auch Ihre eigenen Fragen stellen oder die Fragen anderer Leute lösen.

Powered by:

X