6

印刷された出力をpythonスクリプトからgrepなどのコマンドにパイプする場合、スクリプトからの出力は、スクリプト全体の完了後にのみフォローアップコマンドにパイプされるように見えます。

たとえばtest_grep.py、次のようなスクリプトでは、次のようになります。

#!/usr/bin/env python
from time import sleep

print "message1"
sleep(5)
print "message2"
sleep(5)
print "message3"

で呼び出すと./test_grep.py | grep message、10秒間何も表示されません。その時点で、3行すべてが表示されます。

これをスクリプトと比較してくださいtest_grep.sh

#!/usr/bin/env bash
echo "message1"
sleep 5 
echo "message2"
sleep 5
echo "message3"

./test_grep.sh | grep messageすぐにを出力message1し、5秒間隔でmessage2とが続きmessage3ます。

これは、Pythonインタープリターの実行が終了すると、次のコマンドで出力を利用できるようになるためだと思います。この動作を変更する方法はありますか?

4

1 に答える 1

8

あなたはそれを行うことができます:

  • printPythonですべてをフラッシュすることにより
  • stdout をバッファリングしないように設定する
  • stdout をラインバッファに設定する

呼び出しpython -uてバッファリングを無効にすることもできます。


最も自然に思えるので、ラインバッファリングオプションを選択します。

open(file, mode='r', buffering=-1 ....)

buffering は、バッファリング ポリシーを設定するために使用されるオプションの整数です。0 を渡してバッファリングをオフに切り替え (バイナリ モードでのみ許可)、1 を渡して行バッファリングを選択し(テキスト モードでのみ使用可能)、整数 > 1 を渡して固定サイズのチャンク バッファのサイズを示します。

バッファリング (典型的な「オープン」) を指定しない場合、出力が直接 TTY を実行する、つまりスクリーン コンソールに送信されることを検出すると、ライン バッファリングが使用されます。出力をパイプするかファイルにリダイレクトすると、大きな (4K / 8K) バッファーに戻ります。


どのように「標準出力をラインバッファに設定」しますか?

から再開できstdoutますsys.stdout = os.fdopen(sys.stdout.fileno(), 'w', 1)

于 2013-02-26T09:19:23.763 に答える