2012-08-03 18 views
9

Everytime ja wykonując mój skrypt Pythona, wydaje się powiesić na tej linii:sys.stdin.readlines() zawiesza skrypt Pythona

lines = sys.stdin.readlines() 

Co należy zrobić, aby naprawić/uniknąć?

EDIT

Oto co robię z lines:

lines = sys.stdin.readlines() 
updates = [line.split() for line in lines] 

EDIT 2

Używam tego skryptu z hakiem git tak jest tam mimo całego EOF?

+0

Należy pamiętać, że readlines() wymaga EOF przed jego zwróceniem. To się nie stanie, dopóki EOF nie zostanie przekazane do wejścia standardowego za pośrednictwem aplikacji wykonawczej/powłoki. –

Odpowiedz

13

To zależy w dużym stopniu od tego, co próbujesz osiągnąć. Możesz być w stanie Do:

for line in sys.stdin: 
    #do something with line 

oczywiście z tego idiomu jak również metoda readlines() używasz, trzeba jakoś wysłać znak EOF do skryptu tak, że wie, że plik jest gotowy do czytać. (W systemie Unix Ctrl-D zwykle robi lewę).

+0

@JasonMock - Tak, zdaję sobie z tego sprawę (dlatego mówię "aby wiedzieli, że plik jest czytany do odczytu"). – mgilson

+0

Używam tego skryptu z haka git, więc czy jest tak wokół EOF? –

+0

@BoA - Przepraszam, nie wiem nic na temat haków git, chociaż wydaje się, że jeśli twój program czyta z fajki, powinien po prostu zadziałać. – mgilson

5

Jeśli nie przekierujesz czegoś na stdin, to należy oczekiwać zachowania. To mówi, że odczytuje dane wejściowe z stdin (z której konsoli korzystałby skrypt). Czeka na twoje wejście.

Patrz: "How to finish sys.stdin.readlines() input?

2

Jeśli używasz programu w sesji interaktywnej, następnie linia ta powoduje Python czytać ze standardowego wejścia (tj klawiatura), aż wysłać znak EOF (Ctrl - D (Unix/Mac) lub Ctrl - Z (Windows)).

>>> import sys 
>>> a = sys.stdin.readlines() 
Test 
Test2 
^Z 
>>> a 
['Test\n', 'Test2\n'] 
3

wiem, że to nie jest bezpośrednio odpowiadając na pytanie, jak inni już poruszono kwestię EOF, ale zazwyczaj to, co znalazłem, który działa najlepiej, gdy czyta wyjście na żywo z długo żył podproces lub stdin jest czas/jeśli linia podejście:

while True: 
    line = sys.stdin.readline() 
    if not line: 
     break 
    process(line) 

W tym przypadku sys.stdin.readline() powróci linie tekstu przed EOF zwrotu. Po podaniu EOF, zostanie zwrócona pusta linia, która wyzwala przerwanie pętli. A zawieszenie może nadal występować tutaj, o ile nie podano EOF.

Warto zauważyć, że zdolność do przetwarzania "wyjścia na żywo", podczas gdy podproces/stdin nadal działa, wymaga aplikacji do pisania w celu wypróżnienia jej wyjścia.

+1

Myślę, że odpowiedź @ mgilsona byłaby lepsza; to by działało, ale jest to bardziej "Pythonowa" droga. – pbfy0

+0

Całkowicie zgadzam się z twierdzeniem, że odpowiedź @ mgilsona jest bardziej pythonic. Po prostu nie uważam, że jest to bardzo przyjazne dla "wyjścia na żywo", takie jak przechwytywanie informacji o stanie z długo działającej aplikacji, aby raportować status z powrotem do użytkownika, ponieważ wymaga pliku podobnego do obiektu do utworzenia EOF przed rozpoczęciem pętli przetwarzanie. W moim przykładzie wywołanie readline() da mi linie tekstu przed zwróceniem EOF. EOF jest wymagany tylko do zerwania z chwilą, dając mi pustą linię. Biorąc to pod uwagę, prawdopodobnie mogę poprawić mój opis, ponieważ nie jest to bardzo jasne. –

+0

Uruchamia dla mnie linux-a ... – pbfy0

Powiązane problemy