Если кому-то действительно нужны эти данные, я бы предложил подключить отладчик 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
' выведет список всех доступных функций. Будьте осторожны, хотя. Вы работаете в режиме реального времени .)
Существует также команда peekfd
(находится в пакете psmisc
в Debian Jessie и других), которая позволит вам увидеть, что скрывается в буферах процесса. Опять же, /proc/$(pidof python)/fd
покажет вам допустимые файловые дескрипторы, которые нужно передать в качестве аргументов peekfd.
Если вы не помните -u
для python, вы всегда можете поставить перед командой команду stdbuf
(в уже установленном coreutils
), чтобы установить для stdin/stdout/stderr значение unbuffered, строку с буферизацией или блок с буферизацией по желанию:
stdbuf -i 0 -o 0 -e 0 python myscript.py > unbuffered.output
Конечно, man pages
- твои друзья, эй! возможно, псевдоним может быть полезным и здесь.
alias python='python -u'
Теперь ваш питон всегда использует -u
для всех ваших попыток командной строки!