2009-05-19 19 views

Respuesta

41

lo mejor que podía llegar a:

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

Probado en GNU/Linux. Parece que debería funcionar en Windows también. Si supiera cómo volver a abrir sys.stdout, sería mucho más fácil:

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

Referencias:
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

[Editar]

Nota que sería probablemente sea mejor cerrar sys.stdout antes de sobrescribirlo.

+0

funcionó como un encanto! –

+1

'stdout' aún vive en' sys .__ stdout__' –

+5

Tenga en cuenta que esto no funciona en Py3K. 'ValueError: no puede tener E/S de texto sin búfer ' – vbo

4

Suponiendo que estás en Windows:

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

lo siento, se olvidó de añadir que. en Linux (ubuntu) –

+4

@Martin DeMello: No agregue nuevos hechos en los comentarios. Por favor actualice su pregunta con nuevos hechos. Los nuevos hechos en los comentarios son difíciles de encontrar. –

+0

hecho. Lo siento por eso. –

6

podría utilizar el hecho de que stderr no está tamponada y tratar de redirigir stdout a 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 truco, pero uno muy lindo :) en realidad no funciona si necesita su stderr separada pero buena idea –

+0

gracias. en cuanto a la separación: no se puede obtener todo, ¿puedes :) –

19

Siempre se puede pasar el parámetro -u en la línea shebang:

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

Ver título: 1. OP lo sabe; 2. quiere hacerlo programáticamente – Tobu

+11

El autor implica el uso de la línea de comandos, no indica familiaridad con la invocación alternativa ofrecida por el shell (shebang). Gracias por sus comentarios útiles. – mikewaters

+6

Esto no parece funcionar con el "env truco". '#!/usr/bin/env python -u'. Obtengo el siguiente error '/ usr/bin/env: python -u: No hay tal archivo o directorio'. Si elimino el '-u', funciona de nuevo. –

Cuestiones relacionadas