2010-07-02 5 views
142
  1. 얼마나 자주 파이썬이 파일로 플러시합니까?
  2. 파이썬은 얼마나 자주 표준 출력으로 플러시합니까?

(1)에 대해 확실하지 않습니다.파이썬은 얼마나 자주 파일로 플러시됩니까?

(2)와 마찬가지로, 나는 파이썬이 매번 새로운 라인 이후에 stdout으로 플러시한다고 믿는다. 하지만 stdout을 파일로 오버로드하면 파일이 자주 플러시됩니까?

답변

223

는, 파이썬은 운영 체제의 기본 버퍼링을 사용하는 것 같아요. 버퍼 크기 (버퍼되지 않음) 또는 버퍼 된 행을 지정할 수 있습니다.

예를 들어, open 함수는 버퍼 크기 인수를 취합니다. 0 버퍼링 수단 1 라인 버퍼를 의미하고, 다른 양의 값 (약)이 크기의 버퍼를 사용하는 수단을 제외 버퍼링 수단 :

http://docs.python.org/library/functions.html#open

"선택적 버퍼링 인수는 파일의 원하는 버퍼 크기를 지정한다. 일반적으로 라인 TTY 장치에 대한 버퍼와 완전히 다른 파일을 버퍼링 시스템 기본을 사용 할 수 있습니다. 생략 할 경우, 시스템 디폴트가 사용됩니다.을 "

bufsize = 0 
f = open('file.txt', 'w', bufsize) 
+11

+1하여 liveAPI 제어 표면 스크립트에서 주로 복사되었습니다. 그게 바로 내가 찾는 것이고 매력처럼 작동합니다. – rein

+0

'open ('file.txt', 'w', 1)'을 할 때 Python 3.4.3 사용하기'나는 적절한 라인 버퍼링을 얻는다. 그러나 내가 더 큰 것을하면 ('file.txt', 'w', 512)'open()하고 싶다.) 8192의 전체'io.DEFAULT_BUFFER_SIZE'를 버퍼링한다. 파이썬 버그, 리눅스 버그, 또는 ID10t 버그? –

11

이것이 파이썬에도 적용되는지는 잘 모르겠지만 실행중인 운영 체제에 따라 다르다고 생각합니다.

예를 들어, Linux에서는 터미널에 대한 출력이 줄 바꿈에서 버퍼를 플러시하는 반면, 파일에 대한 출력에서는 버퍼가 가득 찼을 때만 플러시됩니다 (기본적으로). 이는 버퍼를 더 적은 시간 동안 플러시하는 것이 더 효율적이기 때문에 사용자가 파일의 개행 문자로 출력이 플러시되지 않으면 사용자가 알아 차리지 못할 가능성이 적기 때문입니다.

필요한 경우 출력을 자동으로 플러시 할 수 있습니다.

편집 : 난 당신이 파이썬에서 자동 플러시 (here에서 기준)이 방법으로 당신이 그것을 다르게 할 구성하지 않는 파일 작업에 대한

#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() 
107

또한 프로그램 파일에 플러시 버퍼를 강제 할 수와 함께3210 방법.

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으로 출력 파일을 테일링 할 때 유용합니다.

+23

docs :'주의 : flush()는 반드시 파일의 데이터를 디스크에 기록하지는 않습니다. 이 동작을 보장하기 위해 flush()와 os.fsync()를 사용하십시오. ' – bobismijnnaam

+10

이 예제에서 다음 명령어는'os.fsync (f.fileno())' – juanmah

+0

@bobismijnnaam입니다. 내가 찾을 수있는 참조는 https://github.com/jprzywoski/python-reference/blob/master/source/docs/file/flush.rst에서 왔으며 누구인지는 알 수 없습니다. –

7

io 모듈에서 읽기 전용 DEFAULT_BUFFER_SIZE 특성을 호출하여 기본 버퍼 크기를 확인할 수도 있습니다.

import io 
print (io.DEFAULT_BUFFER_SIZE) 
0

그가 선호하는 OP를 선택하는 또 다른 방법이 있습니다.

다른 코드 앞에 __init__ 평 파일에 아래의 코드를 포함

메시지는 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가 수행하지 않음) 실시간으로 업데이트되는 로그를 확인할 수 있습니다.

크레딧 :이 코드는 "라인 버퍼"부분에 대한 나단 Ramella

관련 문제