2017-09-12 10 views
1

저는 Ubuntu에서 Python3.5를 사용하고 있습니다. 다음 스크립트 파일 out을 만들고 "안녕하세요"점점 더 많은 라인을 채 웁니다 :Python : contextlib.redirect_stdout이 때때로 실시간으로 작동하지 않습니다.

import contextlib 
with contextlib.redirect_stdout(open('out','w')): 
    while True: 
     print('Hello') 

그러나 나는 time.sleep()에 대한 호출을 추가하여 작은 수정을하는 경우, 파일 out이 비어 유지 :

import contextlib 
import time 
with contextlib.redirect_stdout(open('out','w')): 
    while True: 
     print('Hello') 
     time.sleep(1) 

루프를 유한 루프로 전환하여 코드를 추가로 변경하면 루프 끝에있는 덩어리로만 out이 채워집니다.

누구든지 이것을 재현하고 설명 할 수 있습니까?

답변

1

출력 버퍼링으로 인해 발생합니다. contextlib을 사용하면 흥미로운 사례이지만 기본 문제는 open('out', 'w') 문과 관련됩니다. 파이썬이 사용하는 경우

출력 버퍼링을 방지하기 위해, 당신은 0buffering argument을 설정할 수 있습니다

import contextlib 
import time 

with contextlib.redirect_stdout(open('out','w', 0)): 
    while True: 
     print 'Hello' 
     time.sleep(1) 

컨텍스트 관리자 (파일을 닫 한 번 또는 파일의 내용이 기록됩니다 또는 한 번 버퍼링 된 콘텐츠가 특정 크기를 초과 함).

Python 3을 사용하는 경우 버퍼링되지 않은 텍스트 I/O (주석에 친절하게 지적됨)를 사용할 수 없습니다.

이 Python3에서 작동하지 않는
import contextlib 
import time 
import sys 

with contextlib.redirect_stdout(open('out','w')): 
    while True: 
     print('Hello') 
     sys.stdout.flush() 
     time.sleep(1) 
+1

참고, 참조 https://stackoverflow.com/questions/27067713/why-text-io 그러나, 각 루프의 끝에서 stdout을 세척하면 원하는 효과를 가져야한다 -must-be-buffered-in-python-3 – Bananach

+0

좋은 캐치, 미안 해요 내 대답을 제대로 테스트해야합니다. Python 3에 대한 적절한 해결 방법을 제공하도록 업데이트되었습니다. –

1

나는 이것이 전에 물어 보았 겠지만 나는 좋은 중복을 찾을 수 없다.

출력 버퍼링으로 인해 발생합니다. stdout이 터미널로 갈 때, 라인 버퍼링을합니다. 즉, "\n"이 발생할 때마다 출력이 프로그램에서 터미널로 전송됩니다. 그러나 stdout이 파일을 참조 할 때 버퍼가 블로킹됩니다. 즉, 실제 출력은 버퍼가 가득 찬 경우 (또는 명시 적으로 플러시 할 때 또는 핸들을 닫을 때)에만 생성됩니다.