簡體   English   中英

Python:contextlib.redirect_stdout有時無法實時運行

[英]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.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM