SE um realmente queria esses dados, sugiro anexar o gdb depurador ao interpretador python, parando a tarefa momentaneamente, chamando fsync(1)
( stdout ), desanexar (continuando o processo) e ir para o arquivo de saída.
Procure em /proc/$(pidof python)/fd
para ver descritores de arquivos válidos. $(pidof x)
retorna o PID do processo chamado ' 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
Eu usei esse método para alterar as configurações do diretório de trabalho, ajustar as configurações ... muitas coisas. Infelizmente, você só pode chamar funções definidas no programa em execução, fsync
funciona muito bem.
(O comando gdb ' info functions
' listará todas as funções disponíveis. Tenha cuidado, porém. Você está operando LIVE em um processo.)
Existe também o comando peekfd
(encontrado em psmisc
package no Debian Jessie e outros) que permitirá que você veja o que está escondido nos buffers de um processo. Novamente, /proc/$(pidof python)/fd
mostrará descritores de arquivos válidos para dar como argumentos para peekfd.
Se você não se lembra de -u
para python, você sempre pode prefixar um comando com stdbuf
(em coreutils
, já instalado) para definir stdin / stdout / stderr para buffer, buffer de linha ou block buffered conforme desejado:
stdbuf -i 0 -o 0 -e 0 python myscript.py > unbuffered.output
Claro, man pages
são seus amigos, ei! talvez um apelido possa ser útil aqui também.
alias python='python -u'
Agora seu python sempre usa -u
para todos os esforços de sua linha de comando!