2010-05-02 11 views
10

Escribí un pequeño guión que nunca termina. Este script genera continuamente resultados que debo verificar de vez en cuando. Lo estoy ejecutando en una computadora de laboratorio a través de SSH, y redirigiendo la salida a un archivo en mi carpeta public_html en esa máquina.¿Cómo hacer que la salida de shell redirija (>) mientras el script está ejecutándose?

python script.py > ~/public_html/results.txt 

Sin embargo, los resultados no se muestran inmediatamente cuando actualizo la dirección. Los resultados aparecen cuando termino el programa, pero como dije, no se detiene solo. ¿Es eso redirigir (>) ser flojo con la escritura? ¿Hay alguna forma de actualizar continuamente (o con un intervalo) los resultados en el archivo?

¿O es el servidor web el que no actualiza el archivo mientras se está escribiendo?

Respuesta

14

Debe descargar la salida sys.stdout.flush() (o smth) si desea verla inmediatamente. Consulte this

+0

Gracias, lo intentaré de inmediato. No pensé que fuera _python_ buffering output. --edit: Lo intenté, no hace la diferencia. así que '>' está almacenando en búfer, o el servidor web. – noio

+0

No importa el comentario anterior, estaba siendo impaciente. Todavía no es "en tiempo real", pero probablemente sea el caché del navegador. – noio

1

Sospecho que el archivo se escribe continuamente, pero que el servidor web informa la fecha de modificación del archivo como la hora en que se abrió y, por lo tanto, informa que no se ha producido ningún cambio en el archivo y el resultado está siendo almacenado en caché (ya sea en el servidor web o en el cliente).

Primero probaría una recarga forzada (Ctrl + F5 o Ctrl + Shift + R o Shift + <reload_button>) y ver si eso ayuda. Si no es así, entonces puedes probar otra cosa.

En una cáscara independiente en el servidor, realice

tail -f ~/public_html/results.txt 

impresiones de la cola a cabo las últimas n líneas del archivo (donde n por defecto a 10), pero el parámetro -f supervisa el archivo y continúa demostrando salida a medida que el archivo crece Esto al menos le dará confianza de que el archivo se está escribiendo de forma incremental.

Espero que ayude.

+0

Gracias, la solución de nc3b funcionó. Tail muestra los resultados más nuevos a medida que se escriben. La vista del navegador se actualiza en lotes cada corto período de tiempo. La actualización forzada no cambia eso. Pero es lo suficientemente rápido. – noio

5

stdout se almacena en el búfer, si no está conectado al terminal.

Usted puede cambiar esta política de alinear-buffering través stdbuf

stdbuf -oL python script.py > ~/public_html/results.txt 

Así que no tienen que limpiar en el script de Python y mantenerlo IO eficiente, si no se requiere alineación de amortiguación.

+0

¿Será esto menos eficiente que 'flush()' de python si se llama con moderación? Yo uso 'flush()' ahora y se llama menos de una vez por línea. – noio

+0

. Dudo que haya una diferencia, porque es muy probable que los datos no se escriban en el disco si no se usa flush (3). Si utiliza su aplicación en una línea de terminal, el almacenamiento en memoria intermedia estará predeterminado.Para trabajos de fondo de larga ejecución, el redireccionamiento a un archivo elegirá un búfer más eficiente. Para casos especiales como el suyo, siempre puede usar stdbuf y así mantener el IO-Code fuera de su aplicación, manteniéndolo flexible y más legible. –

+1

¿Dónde puedo encontrar stdbuf en ubuntu? no parece estar incluido en el paquete coreutils – simao

Cuestiones relacionadas