2016-10-09 2 views
0

zu verwenden, habe ich eine Python-Skript Suche nach Protokollen, es kontinuierlich ausgegeben die Protokolle gefunden und ich mag Linux-Rohr verwenden, um die gewünschte Ausgabe zu filtern. Beispiel wie folgt aus:Python wie subprocess Rohr mit Linux-Shell

$ python logsearch.py ​​| grep Timeout

Das Problem ist die Art und WC ist, bis die logsearch.py ​​Oberflächen blockiert, während die logsearch.py ​​wird kontinuierliche Ausgabe des Ergebnis.

Probe logsearch.py:

p = subprocess.Popen("ping google.com", shell=True, stdin=subprocess.PIPE, stdout=subprocess.PIPE) 
for line in p.stdout: 
    print(line) 

UPDATE:

herausgefunden, ändern Sie einfach den stdout in subprocess sys.stdout, Python für Sie das Rohr behandelt.

p = subprocess.Popen("ping -c 5 google.com", shell=True, stdout=**sys.stdout**) 

Vielen Dank für alle Hilfe!

+0

'ping -c 5' ein ungeradees Beispiel für ein Skript, das immer läuft! Aber, ja, du kannst Dinge nicht sortieren oder die Anzahl der Dinge zählen, bis du sie alle hast. – tdelaney

+0

@tdelaney Ich habe die Anzahl für Ping entfernt und anstelle der Sortierung verwende ich grep, also nehmen wir an, die Daten sollten in die grep durch Pipe fließen, aber es scheint, läuft für immer ohne etwas drucken. –

+0

Sie erhalten nichts, weil die Ausgabe nicht mit dem Timeout übereinstimmt. Probieren Sie $ python logsearch.py ​​| aus grep -v timeout –

Antwort

0

Und warum Verwendung grep? Warum tust du nicht alles in Python?

from subprocess import Popen, PIPE 
p = Popen(['ping', 'google.com'], shell=False, stdin=PIPE, stdout=PIPE) 

for line in p.stdout: 
    if 'timeout' in line.split(): 
     # Process the error 
     print("Timeout error!!") 
    else: 
     print(line) 

UPDATE:
ich die Popen Linie wie empfohlen @triplee ändern. Vor-und Nachteile in Actual meaning of 'shell=True' in subprocess

+0

der grund muss grep oder andere shell cmd ist es, die flexibilität hinzuzufügen, einige zeit, die wir vielleicht grep oder sort oder awk hinzufügen möchten, um die daten besser zu verarbeiten. –

+0

OK. Nur für den Fall, können Sie das [Python-Modul sh] verwenden (https://pypi.python.org/pypi/sh). Implementiert eine Menge bash nützliche Befehle. –

+0

Verwenden Sie auch 'Popen (['ping', 'google.com'], shell = False, ...)', um zu vermeiden, dass eine nutzlose Shell erzeugt wird. – tripleee