互動式腳本中帶有 tee 的即時列印語句

互動式腳本中帶有 tee 的即時列印語句

long_interactive_script.py我有一個包含數千條語句的程式print。我想透過管道傳輸程式tee(或替代方案),以便我可以保存輸出。

如果我做

long_interactive_script.py | tee logfile.txt

Python 將其列印語句放入 4K 緩衝區中,使我得到:

沒什麼,沒什麼,沒什麼,沒什麼,一大堆文字! ,沒什麼,沒什麼,單字中間有一個 sudo 提示符,沒什麼,沒什麼,一大堆文字!

為了避免緩衝區,我嘗試了:

unbuffer long_interactive_script.py | tee logfile.txt

但這會導致我的腳本停止互動。所以當腳本中斷時須藤提示,它停止了。

注意:我無法sudo在運行腳本之前進行簡單操作。互動式腳本僅sudo在某些運行時需要,並且我不想sudo在不需要時詢問。

更多的...

stdbuf -oL long_interactive_script.py | tee -a logfile.txt

在一定程度上起作用。我獲得了所有所需的數據,但也收到此錯誤:

ERROR: ld.so: object '/usr/lib64/coreutils/libstdbuf.so' from LD_PRELOAD cannot be preloaded: ignored.

答案1

為 Python 的標準輸出流指定一個零大小的緩衝區。您可以透過使用該-u標誌或以下語句呼叫 Python 來完成此操作。

sys.stdout = os.fdopen(sys.stdout.fileno(), 'w', 0)

答案2

儘管有緩衝的解決方法,但這就是其他人使用的原因script,它捕獲寫入終端的所有字符,而不會幹擾互動式提示。

產生的typescript檔案比僅僅重定向到標準輸出要醜一些,但是(假設您的應用程式在該模式下提供有用的信息),只需修剪回車符就足夠了。

除了回車符之外,還需要過濾掉編輯字元。請參閱範例:

相關內容