2013-05-16 1 views
0
import urllib2 
import webbrowser 
import time 
import sys 

URL = "http://nonexisting" 

while True: 
    try: 
     website = urllib2.urlopen(URL, timeout=1) 

     if website: 
      webbrowser.open_new(URL) 
      break 

    except KeyboardInterrupt: 
     break 

    except: 
     sys.stdout.write('.') 
     time.sleep(1) 

Я ожидаю, что этот код, чтобы написать точку каждый второй, но вместо того, чтобы ничего не происходит, и когда я нажимаю CTRL- C я получаю этот выход:Output не отображается на стандартный вывод в Python при написании в попробовать ... кроме того: блок

^C..........Traceback (most recent call last): 
    File "stackoverflow_question.py", line 21, in <module> 
    time.sleep(1) 
KeyboardInterrupt 

Таким образом, каждую точку появляется после прерывания. Почему это ? Как я могу достичь ожидаемого результата? Я пробовал с заявлением print либо с тем же результатом. В OS X и Linux тоже.

ответ

3

Вы не сбросили буфер, поэтому на самом деле выход не произошел; он хранится где-то в подвешенном состоянии.

После того, как вы прерываете, буфер очищается.

Смотрите эти ссылки для получения дополнительной информации:

Disable output buffering

How to flush output of Python print?

Кроме того, цитата из mgilson с комментарием:

этот код будет тратить большую часть его время во времени .спать. В течение этого интервала KeyboardInterrupt не будет пойман.

+2

Кроме того, этот код будет тратить большую часть времени на 'time.sleep'. В течение этого интервала 'KeyboardInterrupt' не будет пойман. – mgilson

+0

действительно! Но программа все равно прерывается: D Итак, как я могу ее поймать и правильно обработать? – kissgyorgy

+1

@Walkman: переместите время в попытке. Для более полного ответа задайте новый вопрос. – SingleNegationElimination

0

Вы пытались использовать print istead sys.stdout.write?

print '.' 
+0

Пожалуйста, не отвечайте, если вы не прочитали вопрос ... – kissgyorgy

Смежные вопросы