2010-12-16 8 views
11

je en train d'écrire un programme simple sommeil python3() sur Python 3.1 et je suis tombé sur ceci:problème

Si j'exécuter sur IDLE il fonctionne comme prévu - estampes "Initializing." et ajoute deux points, l'un après chaque Deuxièmement, et attend une entrée.

from time import sleep 

def initialize(): 
    print('Initializing.', end='') 
    sleep(1) 
    print(" .", end='') 
    sleep(1) 
    print(" .", end='') 
    input() 

initialize() 

Le problème est que lorsque je double-clique sur le py pour exécuter le fichier, il fonctionne sur python.exe au lieu de pythonw.exe, et les choses étranges se produisent: il se joint à tous les sleep() fois-à-dire me fait attendez 2 secondes, puis imprime toute la chaîne Initializing. . . à la fois. Pourquoi cela arrive-t-il? Y a-t-il un moyen d'éviter cela dans le terminal? Cela fonctionne bien si j'utilise l'IDLE à la fois dans Windows et Linux.

+2

J'imagine la raison pour laquelle il est mise en mémoire tampon est parce que vous ne l'avez pas donné une encore '\ n'. En général, l'utilisation de 'end' indiquera que vous continuez à écrire quelque chose immédiatement. –

Répondre

21

En effet, la sortie est tamponne.

Vous devez ajouter un sys.stdout.flush() après chaque écriture

+0

Merci, cela l'a résolu! – roddds

+1

Et, après 4 ans, je viens de remarquer que je n'ai jamais vraiment défini cela comme une réponse acceptée. – roddds

+5

En utilisant la fonction 'print' de Python 3, vous pouvez également utiliser le paramètre' flush', par ex. 'print (". ", end = '', flush = True)' –

5

Il semble que la différence est que stdout est automatiquement vidé dans IDLE. Pour plus d'efficacité, les langages de programmation enregistrent souvent un tas d'appels avant d'écrire à l'écran, ce qui est un processus lent.

Voici une autre question qui a la réponse dont vous avez besoin: How to flush output of Python print?