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)/fd
pour 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 fsync
fonctionne 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 psmisc
paquet 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)/fd
vous montrera des descripteurs de fichiers valides à donner comme arguments à peekfd.
Si vous ne vous souvenez pas -u
de 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 pages
sont vos amis, hé! peut-être qu'un alias pourrait également être utile ici.
alias python='python -u'
Maintenant, votre python utilise toujours -u
pour tous vos efforts en ligne de commande!