Shell
立即將 Python 標準輸出寫入文件
嘗試將 Python 腳本中的標準輸出寫入文本文件 (
python script.py > log
) 時,會在命令啟動時創建文本文件,但在 Python 腳本完成之前不會寫入實際內容。例如:script.py:
import time for i in range(10): print('bla') time.sleep(5)
呼叫時每 5 秒列印到標準輸出
python script.py
,但是當我呼叫時python script.py > log
,日誌文件的大小保持為零,直到腳本完成。是否可以直接寫入日誌文件,以便您可以跟踪腳本的進度(例如使用tail
)?編輯事實證明
python -u script.py
,我不知道標準輸出的緩衝。
發生這種情況是因為通常當程序 STDOUT 被重定向到終端以外的東西時,輸出被緩衝到一些特定於作業系統大小的緩衝區(在許多情況下可能是 4k 或 8k)。相反,當輸出到終端時,STDOUT 將被行緩衝或根本不緩衝,因此您將在每個字元之後
\n
或每個字元之後看到輸出。您通常可以使用該
stdbuf
實用程序更改 STDOUT 緩衝:stdbuf -oL python script.py > log
現在,如果您
tail -F log
,您應該會在生成時立即看到每一行輸出。或者,在每次列印後顯式刷新輸出流應該達到相同的效果。看起來
sys.stdout.flush()
應該在 Python 中實現這一點。如果您使用的是 Python 3.3 或更新版本,該flush
關鍵字可以執行此操作:print('hello', flush=True)
.