
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
ファイルは、標準出力にリダイレクトするだけの場合よりも少し見苦しくなりますが、(アプリケーションがそのモードで有用な情報を提供していると仮定すると) 復帰文字をトリミングするだけで十分です。
改行だけでなく、フィルタリングする編集文字もあります。例: