Запишите Python stdout в файл сразу

Попробуйте это:

find . -type f -print0 | tee /tmp/file-list | xargs -0 egrep whatever

/tmp/file-list (просматривают его с чем-то, что не возражает, аннулирует), содержат Ваш желаемый файл (файлы)? Если не, это - проблема находки. Если да, это - вопрос xargs.

Я имею намеренно не 2> 'd далеко ошибки. Они могут быть полезными.

55
19.11.2017, 21:54
3 ответа

Это происходит потому, что обычно, когда процесс STDOUT перенаправляется на что-то, кроме терминала, то вывод буферируется в буфер, специфичный ОС (возможно, 4K или 8K во многих случаях). И наоборот, при выводе на терминал STDOUT будет буферизирован или не буферизирован или не буферизован, поэтому вы увидите вывод после каждого \ N или для каждого символа.

Вы обычно можете изменить буферизацию Stdout с помощью утилиты STBUF :

stdbuf -oL python script.py > log

Теперь, если вы Log , вы должны увидеть каждую вывод строки, как она сгенерирована.


Альтернативно явная промывка выходного потока после каждого печатания должна достичь одинакового. Похоже, это Sys.Stdout.flush () должен достичь этого в Python. Если вы используете Python 3.3 или новее, функция Print также имеет ключевое слово Flush , которое делает это: Печать («Hello», Flush = True) .

67
27.01.2020, 19:33

Это должно сделать работу:

import time, sys
for i in range(10):
    print('bla')
    sys.stdout.flush()
    time.sleep(5)

, поскольку Python будет буферизовать STDOUT , здесь я использовал Sys.Stdout.flush () Чтобы промыть буфер.

Другое решение было бы использовать -U (небуферированный) выключатель Python . Итак, следующее тоже будет делать:

python -u script.py >> log
45
27.01.2020, 19:33

Вы должны передать flush=True в функцию print :

import time

for i in range(10):
    print('bla', flush=True)
    time.sleep(5)

Согласно документации, по умолчанию print ничего не заставляет работать со смывом:

Вопрос о том, буферизован ли вывод обычно определяется файлом, но если Ключевой аргумент flush истинен, поток принудительно промывается.

А в документации к строкам sys сказано:

В интерактивном режиме стандартные потоки буферизируются строками. В противном случае, они блочно-буферизированы, как обычные текстовые файлы. Вы можете переопределить это с помощью опции командной строки -u.


Если вы застряли с древней версией питона, вам необходимо вызвать метод flush из sys. stdout stream:

import sys
import time

for i in range(10):
    print('bla')
    sys.stdout.flush()
    time.sleep(5)
10
27.01.2020, 19:33

Теги

Похожие вопросы