
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
檔案比僅僅重定向到標準輸出要醜一些,但是(假設您的應用程式在該模式下提供有用的信息),只需修剪回車符就足夠了。
除了回車符之外,還需要過濾掉編輯字元。請參閱範例: