IT이야기

프로그램 내에서 python의 버퍼링되지 않은 stdout(python -u에서와 같이)

cyworld 2021. 10. 4. 20:51
반응형

프로그램 내에서 python의 버퍼링되지 않은 stdout(python -u에서와 같이)


중복 가능성:
Python 출력 버퍼링

내 코드 내에서 python -u 실행 효과를 얻을 수 있는 방법이 있습니까? 실패하면 내 프로그램이 -u 모드에서 실행 중인지 확인하고 그렇지 않은 경우 오류 메시지와 함께 종료할 수 있습니까? 이것은 Linux(우분투 8.10 서버)에 있습니다.


내가 생각해낼 수 있는 최선:

>>> import os
>>> import sys
>>> unbuffered = os.fdopen(sys.stdout.fileno(), 'w', 0)
>>> unbuffered.write('test')
test>>> 
>>> sys.stdout = unbuffered
>>> print 'test'
test

GNU/Linux에서 테스트되었습니다. Windows에서도 작동해야 할 것 같습니다. sys.stdout을 다시 여는 방법을 안다면 훨씬 쉬울 것입니다.

sys.stdout = open('???', 'w', 0)

참조:
http://docs.python.org/library/stdtypes.html#file-objects
http://docs.python.org/library/functions.html#open
http://docs.python.org/library/ os.html#file-object-creation

[편집하다]

덮어쓰기 전에 sys.stdout을 닫는 것이 좋습니다.


shebang 라인에서 항상 -u 매개변수를 전달할 수 있습니다.

#!/usr/bin/python -u

Windows에 있다고 가정:

msvcrt.setmode(sys.stdout.fileno(), os.O_BINARY)

... 그리고 유닉스에서:

fl = fcntl.fcntl(sys.stdout.fileno(), fcntl.F_GETFL)
fl |= os.O_SYNC
fcntl.fcntl(sys.stdout.fileno(), fcntl.F_SETFL, fl)

(Unix는 링크가 아닌 주석이 달린 솔루션에서 복사했습니다.)


stderr이 버퍼링되지 않는다는 사실을 사용하고 stdout을 stderr로 리디렉션하려고 할 수 있습니다.

import sys
#buffered output is here
doStuff()

oldStdout = sys.stdout
sys.stdout = sys.stderr
#unbuffered output from here on

doMoreStuff()
sys.stdout = oldStdout

#the output is buffered again
doEvenMoreStuff()

ReferenceURL : https://stackoverflow.com/questions/881696/unbuffered-stdout-in-python-as-in-python-u-from-within-the-program

반응형