Sed
如何實時過濾錯誤消息
我目前在 Raspberry Pi 4 上的 Python 中使用 OpenCV,由於 libjpeg 的問題,我不斷收到不必要的控制台消息,例如:
Corrupt JPEG data: 10 extraneous bytes before marker 0xd6
我的目標是過濾掉這些消息,同時仍然實時列印任何其他錯誤消息(當然還有正常的標準輸出)。該程序是互動式的,所以我必須仍然能夠在程序執行時為其提供輸入。
我試圖使用這個答案從 Python 中禁用列印到 stderr 和 stdout(以防萬一),但似乎錯誤是由一個單獨的程序(我假設是 libjpeg)引發的,因此從 Python 中重定向 sys.stderr是無效的。我還嘗試創建一個 bash one 襯裡來過濾掉以“Corrupt”開頭的錯誤消息,結果如下:
python test.py 2> >(sed -u '/^Corrupt/ d')
這部分有效,因為它過濾掉了這些消息,但在腳本結束之前它也不會顯示任何其他錯誤消息。因此,如果拋出錯誤,一旦腳本完成,它和所有其他錯誤消息都會同時顯示,但僅在那時。如果該過程通過 CTRL-C 過早結束,則根本不會顯示錯誤。
關於如何過濾錯誤流而不緩衝所有其他錯誤消息直到結束的任何想法?
當直接列印到終端時,Python 預設會做行緩衝,這樣你就可以看到發生了什麼。但是當將輸出發送到管道/文件時,Python 會完全緩衝它。這是許多 Linux 命令的常見行為。要繞過它,請使用**
python -u
**顯式取消緩衝輸出。
嘗試:
python test.py 2>&1 | grep -v "Corrupt JPEG data"