2010-08-18 12 views
11

Estoy haciendo declaraciones de impresión en python. Estoy la ejecución de mi guión de esta manera:Declaraciones de impresión de Python que se almacenan en búfer con> redirección de salida

python script.py > out.log nohup & 

Las declaraciones de impresión no son todos los que muestran en out.log pero el programa está terminando bien.

Esa línea de código se encuentra en un archivo .sh ejecuto haciendo ./script.sh

Actualización: El registro se pone todos los datos, pero no hasta que se impriman un cierto # de líneas. Parece que está almacenando en búfer la salida.

Respuesta

23

Cuando stdout se envía a un tty, se almacenará en línea y se enjuagará en cada línea, pero cuando se redirija a un archivo o tubería, se amortiguará por completo y solo se purgará periódicamente cuando rebase el búfer.

Tendrá que agregar sys.stdout.flush() llamadas después de cada línea si desea que la salida sea inmediatamente visible, o deshabilitar el almacenamiento en búfer por completo. Ver Disable output buffering maneras de hacer este último:

  1. Utilice el modificador de la línea -u comando
  2. Wrap sys.stdout en un objeto que elimina después de cada escritura
  3. Establecer PYTHONUNBUFFERED env var
  4. sys.stdout = os.fdopen(sys.stdout.fileno(), 'w', 0)
1

¿Usted intentó:

  1. Correr sin la redirección y asegurándose de que todo se imprime como se esperaba
  2. Correr no a través de un script de shell, sino simplemente desde una línea de comandos

?

Estos pasos pueden ayudarlo a "llegar a casa" en el problema.

+0

gracias lo intentarán – user420814

+0

# 1 y # 2 funcionan como se esperaba – user420814

Cuestiones relacionadas