2014-02-24 53 views
0

我正在尋找一種方法將輸出從標準輸出重定向到文件而不會延遲。 寫入文件似乎確定使用下面的代碼:將輸出無延遲地重定向到Python中的文件

import time 
import sys,os 
def test(): 
    j = 1 
    while j < 10 : 
     time.sleep(1) 
     print("Python is good .Iteration ",j) 
     j +=1 

if __name__ == "__main__": 
    myFile= open("logFile.log", "w", 0) 
    sys.stdout= myFile 
    test() 

然而,這只是寫在文件上的第9次迭代後的代碼,即完成。我想知道,如果我們可以寫數據到整個代碼完成前文件,並查看文件輸出由可能做一個尾-f LOGFILE.LOG提前

感謝

+0

@AlexThornton了'打印( 「Python是好.Iteration」,J),因爲他的重定向'將寫入該文件的''發射試驗()':) – Torxed

回答

2

這是因爲沒有什麼是沖洗輸出緩衝區。 嘗試在一段時間一次加給你的代碼:

sys.stdout.flush() 

它並不完美,但應該工作。
同樣是在清晨,有可能比這更好的解決辦法,但我想出了這個主意剛纔:

class log(): 
    def __init__(self, file): 
     self.file = open(file, 'r', 0) 

    def write(self, what): 
     self.file.write(what) 
     self.file.flush() 

    def __getattr__(self, attr): 
     return getattr(self.file, attr) 

sys.stdout = log() 

哈哈,和雅那是在欺騙了顯着的解決方案,所以我會將分數指向該帖子:P擊敗它30秒:)

+0

Torxed喜sys.stdout'之前, 我一直在尋找能夠在寫入數據時看到數據的輸出,而不是在程序結束時看到的東西。我已經嘗試過flush(),但似乎我們只能在程序結束時看到文件上的數據? –

+0

@paarthbatra在每個'print(...)'執行'sys.stdout.flush()':) – Torxed

+0

@Alex Thornton sys.stdout.flush()作爲預期的問題是我在窗口中使用它,不能看到尾巴就像輸出一樣。在linux尾巴上工作。 感謝您的答案,但我正在尋找一個Qt TextEdit作爲這個數據的標準輸出,並保持它作爲buffereing,我的意思是顯示數據沒有延遲。謝謝:) –

1

對於每一次迭代,您必須添加此項。

sys.stdout.flush() 

這會刷新輸出緩衝區,並執行打開和關閉文件的等效操作,以便修改被附加。

但是,我沒有看到它在最後附加所有數據時出了什麼問題,因爲仍然會得到相同的結果,並且無論如何您都無法在外部訪問該文件。

+0

我很傷心。另外,「有什麼問題」是數據可能會丟失,具體取決於進程如何死亡以及文件系統如何處理它。 'flush()'與打開/關閉文件句柄無關。僅供參考。但我假設你指的是它將輸出數據到文件的事實,就像你手動關閉它一樣?那麼這是因爲'close()'刷新,如此接近是flush的平等而不是其他方式:) – Torxed

+0

這是我的問題,好像如何訪問文件,而程序仍然在外部寫入它,因爲我們在Linux ,尾巴-f。 –

0

輸出被緩存,因爲將更大的數據塊寫入文件會更高效。 您可以顯式地使用緩衝區flush(),也可以使用sys.stderr作爲輸出。第三種方法可能是更大型項目的更好解決方案,可以使用Python中包含的logging模塊。它允許您引發具有不同日誌級別的消息並以不同方式重定向這些日誌級別,包括直接刷新到文件。

1

一個簡單的解決方案是爲python命令添加一個-u選項來強制unbuffered stdin,stdout和stderr。

python -u myscript.py