2017-09-19 51 views
1

我正在尋找一種方法來監視Linux上的程序寫入的文件。我在here中發現了tail -F命令,並且還推薦使用less +FG。我通過在一個終端運行tail -F file測試它,和一個簡單的Python腳本:tail和less命令沒有實時監視文件

import time 

for i in range(20): 
    print i 
    time.sleep(0.5) 
在另一個

。我重定向輸出到文件:

python script.py >> file 

我預計tail將跟蹤該文件的內容,並更新固定的時間間隔顯示,而是僅包含了後終止命令寫入文件

同樣的事情發生在less +FG以及如果我看cat的輸出。我也嘗試使用通常的重定向,它會截斷文件>而不是>>。在這裏它說文件被截斷了,但仍然沒有實時跟蹤它。

任何想法,爲什麼這是行不通的? (它的建議here,這可能是由於緩存的寫入,但因爲我的腳本運行超過10秒,我懷疑這可能不是原因)

編輯:在它的事項的情況下,我運行Linux Mint的18.1

回答

7

Python的標準輸出緩衝。如果當你關閉腳本/腳本完成時,你會看到所有的輸出 - 這肯定是緩衝區問題。

您可以使用它代替:

import time 
import sys 

for i in range(20): 
    sys.stdout.write('%d\n' % i) 
    sys.stdout.flush() 
    time.sleep(0.5) 

我測試過它,它在實時打印值。爲了克服緩衝區問題,在每個.write()方法之後,我使用.flush()強制「緩衝」緩衝區。


從註釋附加選項:

  • 使用原print語句sys.stdout.flush()後記
  • 運行與python -u的python腳本用於緩衝的二進制輸出和錯誤
+1

Probaly你想'sys.stdout.write('%d \ n'%i)',或者等價物,因爲原來使用的'print'包含換行符。 – larsks

+0

@larsks感謝您的評論,我在回答中修復了它 – Vinny

+4

您可以將其保留爲'print'並仍然使用'sys.stdout.flush()'。 –

0

對於jon1467回答(抱歉不能評論喲你的回答),你對重定向的理解是錯誤的。

試試這個:一邊看着文件的大小與

dd if=/dev/urandom > test.txt 

ls -l test.txt 

你會看到,而DD正在運行的文件增長。

Vinny的回答是正確的,python標準輸出是緩衝的。 您注意到的「緩衝效應」更常見的方法是通過沖洗標準輸出,如Vinny向您顯示的那樣。

你也可以使用-u選項來禁用緩衝整個python的過程中,或者您也可以(至少在python2)重新打開標準輸出爲0,如下緩衝區大小:

sys.stdout = os.fdopen(sys.stdout.fileno(), 'w', 0)