Desactivar el almacenamiento en búfer

¿Dónde está el búfer en este siguiente … y cómo lo apago?

Estoy escribiendo a stdout en un progtwig de python así:

for line in sys.stdin: print line 

Hay algo de amortiguación pasando aquí

 tail -f data.txt | grep -e APL | python -u Interpret.py 

Intenté lo siguiente para deshacerme de un posible almacenamiento en búfer … sin suerte:

Para comparar mis expectativas, probé:

 tail -f data.txt | grep -e APL 

Esto produce un flujo constante de líneas … seguramente no está tan amortiguado como el comando python.

Entonces, ¿cómo puedo desactivar el almacenamiento en búfer? RESPUESTA: Resulta que hay un búfer en ambos extremos de la tubería.

El problema, creo que está en grep búfer su salida. Lo está haciendo cuando la tail -f | grep ... | some_other_prog tubería tail -f | grep ... | some_other_prog tail -f | grep ... | some_other_prog tail -f | grep ... | some_other_prog . Para hacer que grep --line-buffered una vez por línea, use la opción --line-buffered :

 % tail -f data.txt | grep -e APL --line-buffered | test.py APL APL APL 

donde test.py es:

 import sys for line in sys.stdin: print(line) 

(Probado en linux, gnome-terminal.)

file.readlines() y for line in file tienen un búfer interno que no se ve afectado por la opción -u (vea la nota sobre la opción -u ). Utilizar

 while True: l=sys.stdin.readline() sys.stdout.write(l) 

en lugar.

Por cierto, sys.stdout tiene un búfer de línea por defecto si apunta al terminal y sys.stderr tiene búfer (consulte el almacenamiento en búfer de stdio ).

El problema está en tu bucle for. Se esperará a EOF antes de continuar. Puedes arreglarlo con un código como este.

 while True: try: line = sys.stdin.readline() except KeyboardInterrupt: break if not line: break print line, 

Probar esto.

sys.stdout = os.fdopen(sys.stdout.fileno(), 'w', 0) y asegúrese de que PYTHONUNBUFFERED esté configurado en su entorno.