2013-07-12 10 views
5

Mam bardzo prostą aplikację:Dlaczego mój program python jest opóźniony do końca programu?

import sys 
from time import sleep 

for i in range(3): 
    sys.stdout.write('.') 
    sleep(1) 

print('Welcome!') 

mogę oczekiwać, że drukowanie kropkę raz drugi (3 razy), po którym należy go wyświetlić „Witaj!”. Niestety, po prostu czeka trzy sekundy, a następnie drukuje wszystko na raz. Jestem na macku ​​z regularnym Pythonem 2.7 i nie mam pojęcia, dlaczego ten kod zachowuje się w ten sposób. Jakieś sugestie?

+0

możliwe duplikat [Python] (buforowanie wyjścia http://stackoverflow.com/questions/107705/ python-output-buffering) – Bruce

+0

Zobacz [to pytanie] (http://stackoverflow.com/questions/107705/python-output-buffering) dla dalszych szczegółów (i bardziej zaawansowanych sposobów robienia tego, co chcesz). – abarnert

Odpowiedz

8

To dlatego, że sys.stdout jest buforowany. Użyj flush:

import sys 
from time import sleep 

for i in range(3): 
    sys.stdout.write('.') 
    sys.stdout.flush() 
    sleep(1) 

print('Welcome!') 
0

Należy użyć print lub logger.

Jeśli chcesz zachować oczekiwane zachowanie, musisz użyć sys.flush, aby wymusić wyjście.

1

stdout to buforowany strumień. Bufor jest domyślnie przepłukiwany, gdy osiągnie znak nowego wiersza.

Jeśli chcesz opróżnić bufor bez pisania znak nowej linii, należy to zrobić jawnie wywołując sys.stdout.flush()

Inną alternatywą jest napisanie do stderr, które nie są buforowane.

1

Możesz wywołać pythona za pomocą -u, aby stdin, stdout i stderr były całkowicie niebuforowane. Zapobiegnie to konieczności ręcznego ich przepłukania.

Na Unix, zadzwoń skrypt jak python -u myscript.py

Albo można umieścić go w shebang: #!/usr/bin/python -u

Powiązane problemy