SI uno realmente quisiera esos datos, sugeriría adjuntar el depurador gdb al intérprete de python, detener momentáneamente la tarea, llamar fsync(1)
( stdout ), desconectarla (reanudar el proceso) y examinar el archivo de salida.
Mire /proc/$(pidof python)/fd
para ver descriptores de archivo válidos. $(pidof x)
devuelve el PID del proceso llamado ' x
'.
# your python script is running merrily over there.... with some PID you've determined.
#
# load gdb
gdb
#
# attach to python interpreter (use the number returned by $(pidof python))
attach 1234
#
# force a sync within the program's world (1 = stdout, which is redirected in your example)
call fsync(1)
#
# the call SHOULD have returned 0x0, sync successful. If you get 0xffffffff (-1), perhaps that wasn't stdout. 0=stdin, 1=stdout, 2=stderr
#
# remove our claws from poor python
detach
#
# we're done!
quit
He usado este método para cambiar los directorios de trabajo, ajustar la configuración sobre la marcha ... muchas cosas. Por desgracia, solo puede llamar a funciones definidas en el programa en ejecución, fsync
aunque funciona bien.
(El comando gdb ' info functions
' enumerará todas las funciones disponibles. Sin embargo, tenga cuidado. Está operando EN VIVO en un proceso).
También está el comando peekfd
(que se encuentra en el psmisc
paquete de Debian Jessie y otros) que le permitirá ver lo que se esconde en las memorias intermedias de un proceso. Nuevamente, /proc/$(pidof python)/fd
le mostraremos descriptores de archivo válidos para dar como argumentos a peekfd.
Si no recuerda -u
para python, siempre puede prefijar un comando con stdbuf
(in coreutils
, ya instalado) para establecer stdin / stdout / stderr en no protegido, bloqueado en línea o bloqueado como lo desee:
stdbuf -i 0 -o 0 -e 0 python myscript.py > unbuffered.output
Por supuesto, man pages
son tus amigos, ¡oye! Tal vez un alias podría ser útil aquí también.
alias python='python -u'
¡Ahora tu python siempre usa -u
para todos tus esfuerzos de línea de comando!