답변:
파일 작업의 경우 Python은 달리 구성하지 않는 한 운영 체제의 기본 버퍼링을 사용합니다. 버퍼 크기, 버퍼링되지 않은 또는 라인 버퍼링을 지정할 수 있습니다.
예를 들어, open 함수는 버퍼 크기 인수를 사용합니다.
http://docs.python.org/library/functions.html#open
"선택적 버퍼링 인수는 파일의 원하는 버퍼 크기를 지정합니다."
암호:
bufsize = 0
f = open('file.txt', 'w', buffering=bufsize)
open('file.txt', 'w', 1)
적절한 라인 버퍼링을 얻을 때 Python 3.4.3을 사용 합니다. 그러나 내가 더 큰 일을 원한다면 (여기서 원했던 open('file.txt', 'w', 512)
) io.DEFAULT_BUFFER_SIZE
8192 전체 를 버퍼링합니다 . 파이썬 버그, 리눅스 버그 또는 ID10t 버그입니까?
stdout
라인 버퍼에 관계없이 콘솔 여부 또는 파일로 리디렉션?
write()
파일 핸들 을 호출 하면 출력이 메모리에 버퍼링되고 버퍼가 가득 찰 때까지 누적됩니다. 버퍼가 "플러시"될 때 (버퍼에서 파일로 내용이 기록됨) flush()
파일 핸들 에서 메소드를 호출하여 명시 적으로 버퍼를 플러시 할 수 있습니다 .
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
.
Note: flush() does not necessarily write the file’s data to disk. Use flush() followed by os.fsync() to ensure this behavior.
Note: flush() does not necessarily write the file’s data to disk. Use flush() followed by os.fsync() to ensure this behavior.
flushing
가 의미하는 것입니다. 왜 필요한가요? 무엇입니까? 왜 내가 신경 써야합니까?
이것이 파이썬에도 적용되는지는 모르겠지만 실행중인 운영 체제에 달려 있다고 생각합니다.
예를 들어 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()
여기에 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 컨트롤 스크립트에서 복사되었습니다.