Якщо б хтось справді бажав цих даних, я б запропонував приєднати налагоджувач 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
для всіх ваших починань командного рядка!