def disable_stdout_buffering():
# Appending to gc.garbage is a way to stop an object from being
# destroyed. If the old sys.stdout is ever collected, it will
# close() stdout, which is not good.
gc.garbage.append(sys.stdout)
sys.stdout = os.fdopen(sys.stdout.fileno(), 'w', 0)
# Then this will give output in the correct order:
disable_stdout_buffering()
print "hello"
subprocess.call(["echo", "bye"])
이전 sys.stdout을 저장하지 않으면 disable_stdout_buffering ()이 dem 등성이 아니며 여러 호출로 인해 다음과 같은 오류가 발생합니다.
Traceback (most recent call last):
File "test/buffering.py", line 17, in <module>
print "hello"
IOError: [Errno 9] Bad file descriptor
close failed: [Errno 9] Bad file descriptor
또 다른 가능성은 다음과 같습니다.
def disable_stdout_buffering():
fileno = sys.stdout.fileno()
temp_fd = os.dup(fileno)
sys.stdout.close()
os.dup2(temp_fd, fileno)
os.close(temp_fd)
sys.stdout = os.fdopen(fileno, "w", 0)
gc.garbage에 추가하는 것은 순환 할 수없는주기가있는 위치에 있으므로 좋은 아이디어가 아닙니다.이를 확인하고 싶을 수도 있습니다.