74 votes

stdout sans tampon en python (comme dans python -u) depuis le programme

Dupliquer possible:
Mise en mémoire tampon de sortie Python

Existe-t-il un moyen d'obtenir l'effet de l'exécution de python -u à partir de mon code? À défaut, mon programme peut-il vérifier s’il fonctionne en mode -u et quitter avec un message d’erreur sinon? C'est sur linux (serveur Ubuntu 8.10)

51voto

Bastien Léonard Points 18404

Le mieux que je pouvais venir avec:

>>> import os
>>> import sys
>>> unbuffered = os.fdopen(sys.stdout.fileno(), 'w', 0)
>>> unbuffered.write('test')
test>>> 
>>> sys.stdout = unbuffered
>>> print 'test'
test

Testé sous GNU/Linux. Il semble qu'il devrait fonctionner sur Windows. Si je savais comment faire pour rouvrir sys.stdout, il serait beaucoup plus facile:

sys.stdout = open('???', 'w', 0)

Références:
http://docs.python.org/library/stdtypes.html#file-objects
http://docs.python.org/library/functions.html#open
http://docs.python.org/library/os.html#file-object-creation

[Modifier]

Notons qu'il serait probablement mieux de fermer sys.stdout avant de l'écraser.

41voto

mikewaters Points 1162

Vous pouvez toujours passer le paramètre -u dans la ligne shebang:

 #!/usr/bin/python -u
 

9voto

RichieHindle Points 98544

En supposant que vous soyez sur Windows:

 msvcrt.setmode(sys.stdout.fileno(), os.O_BINARY)
 

8voto

bgbg Points 4713

Vous pouvez utiliser le fait que stderr n'est jamais mis en mémoire tampon et essayer de rediriger stdout vers stderr:

     import sys
    #buffered output is here
    doStuff()

    oldStdout = sys.stdout
    sys.stdout = sys.stderr
    #unbuffered output from here on

    doMoreStuff()
    sys.stdout = oldStdout

    #the output is buffered again
    doEvenMoreStuff()
 

3voto

Michael Kuhn Points 1449

Je pense que cette question a déjà été posée sur SO :

 import sys
sys.stdout.flush()
 

(Bien que vous souhaitiez probablement le faire sans vider constamment sys.stdout?)

Prograide.com

Prograide est une communauté de développeurs qui cherche à élargir la connaissance de la programmation au-delà de l'anglais.
Pour cela nous avons les plus grands doutes résolus en français et vous pouvez aussi poser vos propres questions ou résoudre celles des autres.

Powered by:

X