Shell

立即將 Python 標準輸出寫入文件

  • May 23, 2020

嘗試將 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 或更新版本,該print函式還有一個flush關鍵字可以執行此操作:print('hello', flush=True).

引用自:https://unix.stackexchange.com/questions/182537