2009-05-19 5 views

Répondre

41

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é sur GNU/Linux. Il semble que cela devrait fonctionner sur Windows aussi. Si je savais comment 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]

Notez qu'il serait probablement préférable de fermer sys.stdout avant de l'écraser.

+0

travaillé comme un charme! –

+1

'stdout' vit toujours dans' sys .__ stdout__' –

+5

Notez que cela ne fonctionne pas dans Py3K. 'ValueError: impossible d'avoir des E/S de texte sans tampon – vbo

4

En supposant que vous êtes sous Windows:

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

désolé, a oublié d'ajouter que. sur Linux (Ubuntu) –

+4

@ Martin DeMello: S'il vous plaît ne pas ajouter de nouveaux faits dans les commentaires. Veuillez mettre à jour votre question avec de nouveaux faits. Les nouveaux faits dans les commentaires sont difficiles à trouver. –

+0

fait. Désolé pour ça. –

6

Vous pouvez utiliser le fait que stderr ne tamponne 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() 
+3

un hack, mais un très mignon :) ne fonctionne pas vraiment si vous besoin de votre stderr séparée mais belle idée –

+0

merci. quant à la séparation: vous ne pouvez pas tout obtenir, pouvez-vous :) –

19

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

#!/usr/bin/python -u 
+13

Voir le titre: 1. OP sait à ce sujet; 2. veut le faire par programme. – Tobu

+11

L'auteur implique l'utilisation de la ligne de commande, n'indiquant pas la familiarité avec l'invocation alternative proposée par le shell (shebang). Merci pour vos commentaires utiles si. – mikewaters

+6

Cela ne semble pas fonctionner avec "l'astuce". '#!/usr/bin/env python -u'. Je reçois l'erreur suivante '/ usr/bin/env: python -u: aucun fichier ou répertoire'. Si je supprime le '-u' cela fonctionne à nouveau. –

Questions connexes