2010-10-31 5 views
2

En C++ ou dans d'autres langues, vous pouvez écrire des programmes qui prennent continuellement des lignes d'entrée à partir de stdin et qui affichent le résultat après chaque ligne. Quelque chose comme:Lecture et sortie Python à partir de Stdin Unbuffered

while (true) { 
    readline 
    break if eof 

    print process(line) 
} 

Je ne peux pas sembler obtenir ce genre de comportement en Python, car il tamponne la sortie (à savoir l'impression ne se produira jusqu'à ce que les sorties en boucle()?). Ainsi, tout est imprimé lorsque le programme se termine. Comment obtenir le même comportement qu'avec les programmes C (où les vidages endl).

Répondre

2

Avez-vous un exemple qui montre le problème?

Par exemple (Python 3):

def process(line): 
    return len(line) 
try: 
    while True: 
     line = input() 
     print(process(line)) 
except EOFError: 
    pass 

Prints la longueur de chaque ligne après chaque ligne.

+1

Si l'entrée est un terminal, stdin Python est ligne-buffered. Sinon, il comprend un tampon. Voir aussi: https://stackoverflow.com/questions/3670323/setting-smaller-buffer-size-for-sys-stdin –

1

Python ne doit pas mettre en mémoire tampon le texte après les retours à la ligne, mais vous pouvez essayer sys.stdout.flush() si cela se produit.

+0

Remarque: uniquement vrai si la sortie est au terminal. Sinon, Python mettra en tampon la sortie. Donc 'sys.stdout.flush()' est en fait le chemin à parcourir si vous avez besoin d'une sortie sans tampon vers un fichier. –

1

Utilisez sys.stdout.flush() pour vider le tampon d'impression.

import sys 

while True: 
    input = raw_input("Provide input to process") 
    # process input 
    print process(input) 
    sys.stdout.flush() 

Docs: http://docs.python.org/library/sys.html

0
$ cat test.py 
import sys 

while True: 
    print sys.stdin.read(1) 

alors je l'exécuter dans le terminal et appuyez sur Entrée après '123' et '456'

$ python test.py 
123 
1 
2 
3 


456 
4 
5 
6 
Questions connexes