エラーメッセージをリアルタイムでフィルタリングする方法

エラーメッセージをリアルタイムでフィルタリングする方法

私は現在Raspberry Pi 4でPythonとしてOpenCVを使用していますが、libjpegの問題により、次の不要なコンソールメッセージが表示され続けます。

Corrupt JPEG data: 10 extraneous bytes before marker 0xd6

私の目標は、他のエラーメッセージをリアルタイムで(もちろん一般的な標準出力に)印刷しながらこれらのメッセージをフィルタリングすることです。プログラムは対話型であるため、プログラムの実行中でもプログラムに入力を提供できる必要があります。

内部的には、stderrとstdoutの印刷を無効にするためにPythonを使ってみました。これしかし、別のプロセス(libjpegと仮定)によってエラーが発生したようですので、Python内でsys.stderrをリダイレクトしても効果はありません。また、「Corrupt」で始まるエラーメッセージをフィルタリングするためにbash one linerを生成しようとしましたが、結果は次のとおりです。

python test.py 2> >(sed -u '/^Corrupt/ d')

これはこれらのメッセージをフィルタリングするため部分的に機能しますが、スクリプトが終了するまで他のエラーメッセージも表示されません。したがって、エラーが発生した場合、スクリプトが完了した後、そのエラーと他のすべてのエラーメッセージが同時に表示されます。 CTRL-Cでプロセスを早く終了すると、エラーはまったく表示されません。

他のすべてのエラーメッセージを最後までバッファリングせずにエラーストリームをフィルタリングする方法についてのアイデアはありますか?

ベストアンサー1

ターミナルに直接印刷すると、Pythonはデフォルトでラインバッファリングを実行するので、何が起こっているのかを確認できます。ただし、出力をパイプ/ファイルに送信すると、Pythonは出力を完全にバッファリングします。これは多くのLinuxコマンドの一般的な動作です。これを解決するには、次のようにします。python -u出力を明示的にアンバッファリングします。

おすすめ記事