- 파이썬은 파일을 얼마나 자주 플러시합니까?
- 파이썬은 얼마나 자주 stdout으로 플러시합니까?
확실하지 않습니다 (1).
(2)에 관해서는, 매 줄마다 파이썬이 stdout으로 플러시한다고 생각합니다. 그러나 stdout에 파일이되도록 과부하하면 자주 플러시됩니까?
답변
파일 작업의 경우 Python은 달리 구성하지 않는 한 운영 체제의 기본 버퍼링을 사용합니다. 버퍼 크기, 버퍼링되지 않은 또는 라인 버퍼링을 지정할 수 있습니다.
예를 들어, open 함수는 버퍼 크기 인수를 사용합니다.
http://docs.python.org/library/functions.html#open
“선택적 버퍼링 인수는 파일의 원하는 버퍼 크기를 지정합니다.”
- 0은 버퍼되지 않음을 의미하고
- 1은 라인 버퍼링을 의미하고
- 다른 양수 값은 해당 크기의 버퍼를 사용한다는 것을 의미합니다.
- 네거티브 버퍼링은 시스템 기본값을 사용하는 것을 의미합니다. 일반적으로 tty 장치의 경우 라인 버퍼링되고 다른 파일의 경우 완전히 버퍼링됩니다.
- 생략하면 시스템 기본값이 사용됩니다.
암호:
bufsize = 0
f = open('file.txt', 'w', buffering=bufsize)
답변
flush()
메소드를 사용하여 프로그래밍 방식으로 버퍼를 파일로 강제 플러시 할 수도 있습니다 .
with open('out.log', 'w+') as f:
f.write('output is ')
# some work
s = 'OK.'
f.write(s)
f.write('\n')
f.flush()
# some other work
f.write('done\n')
f.flush()
출력 파일에 꼬리를 달 때 유용하다는 것을 알았습니다 tail -f
.
답변
이것이 파이썬에도 적용되는지는 모르겠지만 실행중인 운영 체제에 달려 있다고 생각합니다.
예를 들어 Linux에서 터미널로의 출력은 개행에서 버퍼를 플러시하는 반면 파일로 출력하는 경우 버퍼가 가득 찼을 때만 기본적으로 플러시됩니다. 버퍼를 더 적은 시간에 플러시하는 것이 더 효율적이고 출력이 파일의 개행에서 플러시되지 않는 경우 사용자가 알아 차리지 못할 수 있기 때문입니다.
필요한 경우 출력을 자동 플러시 할 수 있습니다.
편집 : 나는 당신이 이런 식으로 파이썬에서 자동 플러시 할 것이라고 생각합니다 ( 여기 부터 )
#0 means there is no buffer, so all output
#will be auto-flushed
fsock = open('out.log', 'w', 0)
sys.stdout = fsock
#do whatever
fsock.close()
답변
io 모듈에서 읽기 전용 DEFAULT_BUFFER_SIZE 속성을 호출하여 기본 버퍼 크기를 확인할 수도 있습니다.
import io
print (io.DEFAULT_BUFFER_SIZE)
답변
여기에 OP를 선택하여 원하는 것을 선택하는 또 다른 접근법이 있습니다.
__init__
다른 코드보다 먼저 .py 파일에 아래 코드를 포함 시키면 인쇄 된 메시지와 print
오류가 더 이상 Ableton의 Log.txt에 기록되지 않고 디스크의 파일을 분리합니다.
import sys
path = "/Users/#username#"
errorLog = open(path + "/stderr.txt", "w", 1)
errorLog.write("---Starting Error Log---\n")
sys.stderr = errorLog
stdoutLog = open(path + "/stdout.txt", "w", 1)
stdoutLog.write("---Starting Standard Out Log---\n")
sys.stdout = stdoutLog
(Mac의 경우 #username#
사용자 폴더 이름으로 변경 합니다. Windows에서는 사용자 폴더 경로의 형식이 다릅니다)
디스크의 파일이 변경 될 때 내용을 새로 고치는 텍스트 편집기에서 파일을 열면 (예 : Mac의 경우 : TextEdit가 아니라 TextWrangler가 수행함) 로그가 실시간으로 업데이트되는 것을 볼 수 있습니다.
크레딧 :이 코드는 대부분 Nathan Ramella에 의해 liveAPI 컨트롤 스크립트에서 복사되었습니다.