Si l'on voulait vraiment ces données, je suggérerais d'attacher le débogueur gdb à l'interpréteur python, d'arrêter momentanément la tâche, d'appeler fsync(1)( stdout ), de la détacher (reprendre le processus) et d'aller parcourir le fichier de sortie.
Regardez /proc/$(pidof python)/fdpour voir les descripteurs de fichiers valides. $(pidof x)renvoie le PID du processus nommé ' 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
J'ai utilisé cette méthode pour modifier les répertoires de travail, modifier les paramètres à la volée ... beaucoup de choses. Hélas, vous ne pouvez appeler que des fonctions définies dans le programme en cours d'exécution, mais cela fsyncfonctionne bien.
(La commande gdb ' info functions' répertorie toutes les fonctions disponibles. Attention cependant. Vous utilisez LIVE sur un processus.)
Il y a aussi la commande peekfd(trouvée dans le psmiscpaquet sur Debian Jessie et autres) qui vous permettra de voir ce qui se cache dans les tampons d'un processus. Encore une fois, /proc/$(pidof python)/fdvous montrera des descripteurs de fichiers valides à donner comme arguments à peekfd.
Si vous ne vous souvenez pas -ude python, vous pouvez toujours préfixer une commande avec stdbuf(in coreutils, déjà installé) pour définir stdin / stdout / stderr sur non tamponné, ligne tamponnée ou bloc tamponné comme vous le souhaitez:
stdbuf -i 0 -o 0 -e 0 python myscript.py > unbuffered.output
Bien sûr, man pagessont vos amis, hé! peut-être qu'un alias pourrait également être utile ici.
alias python='python -u'
Maintenant, votre python utilise toujours -upour tous vos efforts en ligne de commande!