2012-03-25 3 views
0

Ich bin mit dem subprocess Modul wie folgt aus:subprocess Ausgabe auf stdout und PIPE

ping = subprocess.Popen('fping.exe 192.168.2.3 196.65.58.69', stdout=PIPE) 
output = ping.stdout.readlines() 

Ich brauche die output Liste, um sie später im Programm zu verarbeiten, aber es scheint, da die stdout gerichtet ist zu PIPE wird die Ergebnisse nicht an die Konsole ausgegeben. Ich möchte sowohl die Konsolenausgabe (wie sie ausgeführt wird) als auch die output Liste bekommen.

Wie kann ich das tun?

Ich habe eine Suche durchgeführt, und bekam eine Antwort here, aber ich kann es nicht implementieren.

Ich verwende Python 3.x auf Windows env.

Danke.

+0

Sie können immer die Ausgabe in Ihrem Skript wiederholen: 'print (output)' –

+0

@LevLevitsky Ich möchte die Konsole Ausgabe als der Befehl ausgeführt werden. –

+0

Was ist mit ['os.dup2'] (http://docs.python.org/release/3.0.1/library/os.html#file-descriptor-operations) dann? –

Antwort

0

Ich habe einen Weg gefunden, das hier zu tun ist:

for line in os.popen("Fping x.x.x.x x.x.x.x -l"): 
    ipList.append(line) 
    print(line) 

Auf diese Weise, ich bin in der Lage, die Ergebnisse aus dem Fping Programm in die Liste zu bekommen, und es auf den Bildschirm, während es zu drucken wird ausgeführt, da die for Schleife mit der os.popen nicht warten auf das Programm zu beenden, sondern immer an jeder Zeile aus dem Programm.

0

Es gibt keine Rohrleitung, die an zwei Stellen verläuft. Alles, was in eine Pipe geschrieben wird, wird nur einmal gelesen. (Während es theoretisch möglich ist, dass Ihr Programm und die Konsole Zugriff auf die gleiche Out-Pipe haben, werden Sie nur dann einen Teil der Daten an Ihr Programm senden und nur die Daten, die nicht funktionieren die Konsole.) Um die gesamte Ausgabe an Ihr Programm und an die Konsole zu senden, muss jemand die Daten lesen und duplizieren. Auf einem Unix-ähnlichen System könnten Sie dafür den "tee" -Befehl verwenden, aber Sie haben diesen wahrscheinlich nicht auf Ihrem Windows-Rechner.

Also müssen Sie die Ausgabe auf die Konsole schreiben, wie Sie es bekommen.

In diesem Fall können Sie wahrscheinlich mit readline() in einer Schleife statt readlines() durchkommen.