Якщо б хтось справді бажав цих даних, я б запропонував приєднати налагоджувач gdb до інтерпретатора python, на мить зупинивши завдання, викликавши fsync(1)( stdout ), відірвіться від нього (відновивши процес) та перейдіть до вивчення вихідного файлу.
Загляньте, /proc/$(pidof python)/fdщоб побачити дійсні дескриптори файлів. $(pidof x)повертає PID процесу з назвою ' 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
Я використовував цей метод, щоб змінити налаштування робочого режиму, налаштувати під час руху багато речей. На жаль, ви можете зателефонувати лише до функцій, визначених у запущеній програмі, fsyncале добре працює.
(Команда gdb ' info functions' відобразить всі доступні функції. Хоча будьте обережні. Ви працюєте LIVE на процесі.)
Існує також команда peekfd(знайдена в psmiscпакеті Debian Jessie та інших), яка дозволить вам побачити, що ховається в буферах процесу. Знову /proc/$(pidof python)/fdпокажемо ваші дійсні дескриптори файлів, які подавати як аргументи peekfd.
Якщо ви не пам’ятаєте -uпро python, ви завжди можете префіксувати команду за допомогою stdbuf(у coreutils, вже встановлений), щоб встановити stdin / stdout / stderr на небуферований, буферний або блокований рядок за бажанням:
stdbuf -i 0 -o 0 -e 0 python myscript.py > unbuffered.output
Звичайно, man pagesваші друзі, ей! можливо, псевдонім може бути корисним і тут.
alias python='python -u'
Тепер ваш пітон завжди використовує -uдля всіх ваших починань командного рядка!