long_interactive_script.py
何千もの文を含むプログラムがありますprint
。tee
出力を保存できるようにプログラム(または代替プログラム)をパイプしたいと思います。
もし私がするなら
long_interactive_script.py | tee logfile.txt
Pythonはprint文を4Kバッファに入れて、
何も、何も、何も、何も、言葉が多い! 、何も、何も、単語の途中にsudoプロンプトがあります、何も、何も、多くのテキストがあります!
バッファを避けるために、以下を試しました。
unbuffer long_interactive_script.py | tee logfile.txt
しかし、これは私のスクリプトの対話を中断します。だからスクリプトが壊れたらSudoヒント、停止しました。
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の標準出力ストリームのサイズが0のバッファを指定します。-u
このフラグまたは次の文を使用してPythonを呼び出すことでこれを行うことができます。
sys.stdout = os.fdopen(sys.stdout.fileno(), 'w', 0)
答え2
バッファリングには回避策がありますが、他の人はそれを使用します。script
、インタラクティブなプロンプトを中断することなく、端末に作成されたすべての文字をキャプチャします。
結果typescript
ファイルは標準出力にリダイレクトするよりも少し醜いですが、アプリケーションがそのモードで有用な情報を提供すると仮定すると、キャリッジリターンを切り捨てるだけで十分です。
キャリッジリターンに加えて、編集文字もフィルタリングする必要があります。例をご覧ください。