2017-02-04 2 views
-2

Wie eine blockierende Lesevorgang von Stdin in Python (2.7), die den Prozess pausiert, bis einige Daten in der Pipe angezeigt werden? Das Problem mit read() liegt in der Tatsache, dass nach dem ersten Mal es read() nicht mehr blockiert. Beispiel:Blockieren von lesen von Stdin in Python

echo 'test test ' | python test.py

# test.py 
import sys 
while True: 
    string = sys.stdin.read() # Blocks only for the first time 
    print '!!!!!!!!' 
+3

'pipe' sendet den Text' test test' zum Skript und schließt die Verbindung - was erwarten Sie mit dem nächsten 'read()'? – furas

+0

Ein anderer Prozess (z. B. Eltern) kann in stdin dieses Prozesses schreiben. –

+0

wie für mich Parent-Prozess kann nur auf "Echo" schreiben, nicht auf Skript. – furas

Antwort

1

f.read() Blöcke, sondern liefert auch eine leere Zeichenfolge, wenn EOF erreicht ist. Ihr Beispiel ist defekt, da der Eingabestream geschlossen ist und EOF erreicht ist. Wahrscheinlich wollten Sie auch eine ganze Zeile lesen, also ist readline geeignet.

+0

Mb, weißt du, gibt es eine Möglichkeit, die Standardversion nach dem Erreichen von eof zu fixieren? –

+0

Es gibt keinen Weg. Ihre Frage klingt ähnlich wie das [XY-Problem] (http://meta.stackexchange.com/a/66378). Es kann jedoch hilfreich sein, wenn Sie Ihr tatsächliches Problem (in einer neuen Frage) angeben. –

+0

Das Problem hat andere Lösungen (zB mit einigen anderen Interprozessing-Tools), dachte ich, dass ich mit dem direkten Ansatz schnell zurecht komme. Das ursprüngliche Problem ist ein Wrapper für den Syntaxnet-Docker-Container, der nicht bei jeder Eingabe neu gestartet werden muss (Startzeit ist beträchtlich). Es kann Daten von stdin verarbeiten und es scheint ziemlich kompliziert zu machen, dass internes Skript etwas anderes liest. –

Verwandte Themen