インタラクティブ スクリプトで tee を使用したリアルタイムの print ステートメント

インタラクティブ スクリプトで tee を使用したリアルタイムの print ステートメント

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

もっと...

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 のバッファを指定します。これは、フラグ付きで Python を呼び出す-uか、次のステートメントを使用して実行できます。

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

答え2

バッファリングの回避策にもかかわらず、他の人が使用する理由はscriptは、対話型プロンプトを妨げることなく、端末に書き込まれたすべての文字をキャプチャします。

結果のtypescriptファイルは、標準出力にリダイレクトするだけの場合よりも少し見苦しくなりますが、(アプリケーションがそのモードで有用な情報を提供していると仮定すると) 復帰文字をトリミングするだけで十分です。

改行だけでなく、フィルタリングする編集文字もあります。例:

関連情報