[英]Python: contextlib.redirect_stdout sometimes doesn't work in real time
我在Ubuntu上使用Python3.5。 以下腳本創建一個文件out
並用越來越多的“ Hello”行填充它:
import contextlib
with contextlib.redirect_stdout(open('out','w')):
while True:
print('Hello')
但是,如果我通過添加對time.sleep()
的調用進行了微小的修改,則文件out
保持空白:
import contextlib
import time
with contextlib.redirect_stdout(open('out','w')):
while True:
print('Hello')
time.sleep(1)
如果我通過將循環變成有限循環來進一步更改代碼,則它會填充out
但只會在循環結束時一次出現。
誰能復制並解釋它?
這是由輸出緩沖引起的。 考慮到使用contextlib
,這是一個有趣的情況,但是潛在的問題是open('out', 'w')
語句。
為了防止輸出緩沖,如果您使用的是Python 2,可以將buffering參數設置為0
:
import contextlib
import time
with contextlib.redirect_stdout(open('out','w', 0)):
while True:
print 'Hello'
time.sleep(1)
或者,一旦上下文管理器關閉文件(或一旦緩沖的內容超過特定大小),就將寫入文件內容。
如果您使用的是Python 3,那么您就不能擁有無緩沖的文本I / O(請在注釋中指出)。 但是,在每個循環結束時刷新stdout
應該具有所需的效果:
import contextlib
import time
import sys
with contextlib.redirect_stdout(open('out','w')):
while True:
print('Hello')
sys.stdout.flush()
time.sleep(1)
我敢打賭,這已經被問過了,但我找不到一個很好的副本。
這是由輸出緩沖引起的。 當stdout進入終端時,它是行緩沖的,這意味着每次遇到"\\n"
時,輸出將從程序發送到終端。 但是,當stdout引用文件時,它將被塊緩沖。 這意味着僅在緩沖區變滿(或顯式刷新緩沖區或關閉句柄)時才生成實際輸出。
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.