2016-04-06 2 views
2

Ich habe ein Stück Code, der einen Prozess startet dann lesen von stdout, um zu sehen, ob es OK geladen hat.Linux-Pipe fertig gelesen, aber Rest zu verwerfen

Danach möchte ich idealerweise die Ausgabe auf /dev/null oder etwas, das es ablegt, umleiten. Ich war (A) was ist die beste Praxis in dieser Situation und (B) was wird mit dem Schreibprozess passieren, wenn die Pfeife voll wird? Wird es jemals blockieren, wenn die Leitung voll wird und nicht gelesen/gelöscht wird?

Wenn das Ziel ist, um auf /dev/null umleiten, wäre es möglich, mir zu zeigen, wie zu diesem mit Python und subprocess.Popen?

proc = subprocess.Popen(command, stderr=subprocess.PIPE) 
while True: 
    if init_string in proc.stderr.readline(): 
     break; 

proc.stderr.redirect ?? 
+0

Sie könnten das Skript ausführen und seine Ausgabe verwerfen 'python firstprogram.py>/dev/null' –

+0

Ich muss jedoch nach dem Lesen ein wenig zuerst verwerfen. – John

Antwort

-2

Wenn Sie möchten, dass alle die Ausgabe verwerfen:

python your_script.py > /dev/null

jedoch, wenn Sie es von Python tun möchten, können Sie verwenden:

import sys 
sys.stdout = open('file', 'w') 
print 'this goes to file' 

Jedesmal, wenn man Druck , die Standardausgabe wurde in die Datei "file" umgeleitet, ändere diese in/dev/null oder eine beliebige Datei und du erhältst die gewünschten Ergebnisse.

+0

Danke, aber ich muss den STDERR NACH dem Lesen für eine Weile umleiten, nicht sofort. Ich bin besorgt, dass das Nichtlesen den Puffer nach einer Weile füllt und den aufrufenden Prozess blockiert, wenn er versucht, in ihn zu schreiben. – John

+0

nach dem Lesen von was? Weil Sie nicht von stderr lesen ... –

+0

Das Skript, das den Prozess startet, liest aus dem Prozess "stderr". Es liest ein paar Init-Nachrichten, um zu überprüfen, ob einige Dinge passiert sind, lässt dann den Prozess offen oder schließt ihn. An dieser Stelle möchte ich die Ausgabe so umleiten, dass der Prozess, der in 'stderr' schreibt, nicht in einen Puffer geschoben wird, der nie gelesen wird. – John

2

Soweit ich weiß, gibt es keine Möglichkeit, Dateideskriptoren eines untergeordneten Prozesses zu schließen und erneut zu öffnen, nachdem es mit der Ausführung begonnen hat. Und ja, es gibt einen begrenzten Puffer im Betriebssystem. Wenn Sie also nichts von der Pipe verbrauchen, blockiert der untergeordnete Prozess schließlich. Das bedeutet, dass Sie nur noch von der Pipe lesen müssen, bis sie vom Schreibende geschlossen ist.

Wenn Sie Ihr Programm wollen, etwas zu tun, die in der Zwischenzeit fortzusetzen, sollten Sie die Daten raubend Umzug in einem separaten Thread (ungetestet) Teil:

def read_all_from_pipe(pipe): 
    for line in pipe: # assuming it's line-based 
    pass 

Thread(lambda: read_all_from_pipe(proc.stderr)).start() 

Es können auch andere Möglichkeiten, Ihr Problem zu lösen, obwohl. Warum müssen Sie auf eine bestimmte Ausgabe warten? Sollte das Kind nicht einfach mit einem Exit-Code ungleich null sterben, wenn es nicht "OK" geladen hat? Können Sie stattdessen überprüfen, dass das Kind tut, was es soll, anstatt dass es irgendeine willkürliche Ausgabe druckt?

+0

Danke! Ich hatte Angst, das wäre der Fall. Ich werde wahrscheinlich einen Reader Thread wie Sie vorschlagen, es schien nur verschwenderisch. – John

+0

Der andere Weg, um es zu tun wäre, um in eine Datei umleiten, und dann haben meine Eltern Anwendung diese Datei lesen? – John

+0

Es gibt keine Möglichkeit, ein Rohr zu spalten, das sich spaltet, und dann einen Teil davon abzusperren? – John

Verwandte Themen