sys.stdout.flush () 메소드 사용법


답변:


173

파이썬의 표준 출력은 버퍼링됩니다 (터미널에 쓰기 전에 일부 데이터를 "쓰기"하여 표준 출력으로 수집 함을 의미합니다). 호출 sys.stdout.flush()하면 버퍼를 "플러시 (flush)"하도록합니다. 즉, 버퍼가 정상적으로 대기하기 전에 버퍼에있는 모든 것을 터미널에 기록합니다.

다음은 (버퍼되지 않은) I / O에 대한 유용한 정보와 유용한 이유입니다.
http://en.wikipedia.org/wiki/Data_buffer
버퍼링 된 버퍼와 버퍼되지 않은 IO


@Ciastopiekarz Windows에서 버퍼를 플러시하려면 어떻게해야합니까?
helplessKirk

@Ciastopiekarz 어떻게 알아? Andrew Clark의 Python 스크립트를 가져 와서 인쇄 줄을 sys.stdout.write("%d" % i)로 바꾸면 sys.stdout.flush()스크립트가 실행될 때 버퍼가 표시되도록 호출 주석을 해제해야합니다 .
베이컨 비트

119

다음과 같은 간단한 Python 스크립트를 고려하십시오.

import time
import sys

for i in range(5):
    print(i),
    #sys.stdout.flush()
    time.sleep(1)

이것은 하나 개의 숫자 5 초 동안 매 초마다 인쇄하도록 설계하지만, 지금처럼 당신이 그것을 실행하는 경우 (기본 시스템 버퍼링에 따라) 스크립트 완료 될 때까지 출력을 볼 수 있으며, 모두 한 번에 당신은 볼 수있다 0 1 2 3 4인쇄 화면에.

출력이 버퍼링되고 있기 때문에 sys.stdout각 후에 플러시하지 않으면 print출력이 즉시 표시되지 않습니다. sys.stdout.flush()차이점을 보려면 줄 에서 주석을 제거 하십시오.


48
Python 3.x에서는 'print i'를 print (i, end = '')로 바꿔야합니다. Python 3의 print ()에는 기본 접두어 end = '\ n'이있어서 콘솔을 플러시하도록합니다.
ofer.sheffer

5
쉼표를 제거하면 예상대로 정상적으로 작동합니다. 새 줄에 대한 버퍼 논리가 있습니까 ??
Sunil Lulla

7

내 이해에 따라 인쇄 문을 실행할 때마다 출력이 버퍼에 기록됩니다. 버퍼가 플러시되면 화면에 출력이 나타납니다. 기본적으로 프로그램이 종료되면 버퍼가 플러시됩니다. 그러나 프로그램에서 "sys.stdout.flush ()"문을 사용하여 버퍼를 수동으로 플러시 할 수도 있습니다. 아래 코드에서 i 값이 5에 도달하면 버퍼가 플러시됩니다.

아래 코드를 실행하여 이해할 수 있습니다.

chiru@online:~$ cat flush.py
import time
import sys

for i in range(10):
    print i
    if i == 5:
        print "Flushing buffer"
        sys.stdout.flush()
    time.sleep(1)

for i in range(10):
    print i,
    if i == 5:
        print "Flushing buffer"
        sys.stdout.flush()
chiru@online:~$ python flush.py 
0 1 2 3 4 5 Flushing buffer
6 7 8 9 0 1 2 3 4 5 Flushing buffer
6 7 8 9

print i출력을 얻기 위해 쉼표가없는 경우
SwimBikeRun

1
import sys
for x in range(10000):
    print "HAPPY >> %s <<\r" % str(x),
    sys.stdout.flush()

1

내 이해에 따라 sys.stdout.flush ()는 해당 지점까지 버퍼링 된 모든 데이터를 파일 객체로 푸시합니다. stdout을 사용하는 동안 데이터는 터미널에 기록되기 전에 버퍼 메모리에 저장됩니다 (일시적 또는 메모리가 채워질 때까지). flush ()를 사용하면 버퍼가 비어 있기 전에도 버퍼를 비우고 터미널에 쓰게됩니다.

당사 사이트를 사용함과 동시에 당사의 쿠키 정책개인정보 보호정책을 읽고 이해하였음을 인정하는 것으로 간주합니다.
Licensed under cc by-sa 3.0 with attribution required.