我有一個 python 程序,它正在慢慢地產生一些輸出。
我想將其捕獲到文件中,但我也認為我可以用尾巴即時觀看它。
所以在一個終端我正在做:
python myprog.py > output.txt
在另一個終端中:
tail -f output.txt
但在 python 程式運行時,尾巴似乎沒有向我顯示任何內容。
如果我按 ctrl-c 來終止 python 腳本,突然,尾部output.txt
開始填滿。但當 python 運行時則不然。
我究竟做錯了什麼?
答案1
您可能還需要明確刷新緩衝區,以便在生成時透過管道傳輸。這是因為通常僅在管道緩衝區填滿(我相信以千位元組為單位)以及標準輸入訊息結束時才列印輸出。這可能是為了節省讀/寫。您可以在每次列印後執行此操作,或者如果您正在循環,則可以在循環內的最後一次列印後執行此操作。
import sys
...
print('Some message')
sys.stdout.flush()
答案2
使用 unbuffered 標誌運行 python:
python -u myprog.py > output.txt
然後輸出將即時列印。
答案3
不要嘗試追蹤即時文件,tee
而是使用。它正是為了做你想做的事而設計的。
從男士T卹:
tee(1) - Linux 手冊頁
姓名 tee - 從標準輸入讀取並寫入標準輸出和文件
概要
tee [OPTION]... [FILE]...
描述
將標準輸入複製到每個文件,也複製到標準輸出。
-a, --append append to the given FILEs, do not overwrite -i, --ignore-interrupts ignore interrupt signals --help display this help and exit --version output version information and exit
如果 FILE 為 -,則再次複製到標準輸出。
所以在你的情況下你會運行:
python myprog.py | tee output.txt
編輯:正如其他人指出的那樣,這個答案將遇到OP最初遇到的相同問題,除非sys.stdout.flush()
在Python程式中使用,如戴維接受的答案所述。我在發布此答案之前所做的測試並未準確反映 OP 的用例。
tee
仍然可以用作顯示輸出同時寫入文件的替代方法(儘管不是最佳方法),但戴維的答案顯然是正確且最佳的答案。
答案4
當我使用 tail 時,它幾乎總是追蹤日誌文件,例如(電子郵件)訊息。
這可能有點奇怪,但是為什麼不使用日誌記錄模組而不是在 Python 程式碼中使用print
//print()
呢? write()
(來自 PSL)注意,日誌記錄格式化程式可以配置為不輸出與傳統日誌關聯的所有時間和 ID 程式碼。
輸出可以配置為轉到(資料)文件,並且由於沒有緩衝延遲或重定向,tail 可以愉快且立即地工作。
問候