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