2017-02-21 81 views
0

我有一個簡單的Python測試代碼下:Python的日誌出現晚

tmp.py

import time 

while True: 
    print "New val" 
    time.sleep(1) 

如果我運行它下面,我看到日誌上終端正常:

python tmp.py 

但是,如果我的日誌重定向到一個日誌文件,它需要相當長的一段日誌文件中出現前:

python tmp.py >/tmp/logs.log 2>&1 

如果我做了cat /tmp/logs.log,輸出出現在該文件比較晚,或者只有當我在重定向的文件按下Ctrl+C

爲什麼我沒有看到日誌立即退出Python應用程序?

是否可以通過我嘗試的簡單I/O重定向解決? (無需在Python代碼中進行代碼更改,通過使用像日誌記錄這樣的模塊)

+1

嘗試使用 「-u」 選項(蟒蛇-u tmp.py> /tmp/logs.log 2>&1) –

+0

感謝那些工作! – vishal

回答

0

問題是輸出是緩衝的,這意味着python將輸出保存在緩衝區中,並且每隔一段時間刷新一次,但不一定每次印刷後。

您可以通過明確調用sys.stdout.flush(),在每次打印後強制刷新來修復。

import time 
import sys 

while True: 
    print "New val" 
    sys.stdout.flush() 
    time.sleep(1) 
+0

由於我的代碼很長。這是很多工作添加大量的沖洗。因爲這個原因,提到「沒有在Python代碼內部進行更改」。感謝您的迴應.. – vishal

1

你的情況的最佳選擇是設置環境變量PYTHONUNBUFFERED

這比調用#/usr/bin/python -u稍微強一些,因爲這可能在某些虛擬環境中不起作用。

在你的終端:

export PYTHONUNBUFFERED=1 
python tmp.py >/tmp/logs.log 2>&1 #or however else you want to call your script.