Отключить буферизацию

Где буфер в этом следующем … и как его отключить?

Я пишу в stdout в программе python, например:

for line in sys.stdin: print line 

Здесь происходит буферизация:

 tail -f data.txt | grep -e APL | python -u Interpret.py 

Я попробовал следующее, чтобы избавиться от возможной буферизации … без везения:

  • как указано выше, используя флаг -u с вызовом python
  • вызывая sys.stdout.flush () после каждого вызова sys.stdout.write () … все они создают буферизованный поток с python, который ждет что-то вроде минуты, чтобы распечатать первые несколько строк.
  • использовала следующую измененную команду:

    stdbuf -o0 tail -f data.txt | stdbuf -o0 -i0 grep -e APL | stdbuf -i0 -o0 python -u Interpret.py

Чтобы оценить мои ожидания, я попытался:

 tail -f data.txt | grep -e APL 

Это создает устойчивый поток строк … это, безусловно, не так буферизируется, как команда python.

Итак, как отключить буферизацию? ОТВЕТ: Оказывается, на обоих концах трубы есть буферизация.

4 Solutions collect form web for “Отключить буферизацию”

Проблема, я считаю, в grep буферизации ее вывода. Он делает это, когда вы нажимаете tail -f | grep ... | some_other_prog tail -f | grep ... | some_other_prog tail -f | grep ... | some_other_prog . Чтобы получить команду grep для очистки один раз в строке, используйте --line-buffered :

 % tail -f data.txt | grep -e APL --line-buffered | test.py APL APL APL 

где test.py :

 import sys for line in sys.stdin: print(line) 

(Протестировано на linux, gnome-terminal.)

file.readlines() и for line in file имеют внутреннюю буферизацию, на которую не влияет опция -u (см. примечание к опции -u ). использование

 while True: l=sys.stdin.readline() sys.stdout.write(l) 

вместо.

Кстати, sys.stdout является sys.stdout буфером по умолчанию, если он указывает на терминал, а sys.stderr (см. sys.stderr stdio ).

Проблема в вашем цикле for. Он будет ждать EOF, прежде чем продолжить. Вы можете исправить это с помощью кода вроде этого.

 while True: try: line = sys.stdin.readline() except KeyboardInterrupt: break if not line: break print line, 

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

sys.stdout = os.fdopen(sys.stdout.fileno(), 'w', 0) и убедитесь, что PYTHONUNBUFFERED установлен в вашей среде.

Python - лучший язык программирования в мире.