1. ホーム
  2. python

[解決済み] 警告のトレースバックを取得する

2023-07-15 12:01:35

質問

numpyでは、次のようなことができます。 np.seterr(invalid='raise') を使用すると、警告がエラーを発生させた場合のトレースバックを取得することができます ( この記事 ).

  • 警告をトレースするための一般的な方法はありますか?
  • 警告が発生したときに、python がトレースバックを与えるようにできますか?

どのように解決するのですか?

に代入することで、望みのものを得ることができます。 warnings.showwarning . は 警告モジュールドキュメント 自体がそうすることを推奨しているのですから、別に ソースのダークサイド . :)

この関数を別の実装に置き換えるには、この関数に代入して warnings.showwarning .

を行う新しい関数を定義することができます。 warning.showwarning と同じことを行い、さらにスタックを表示する新しい関数を定義できます。そして、元の関数の代わりにそれを配置します。

import traceback
import warnings
import sys

def warn_with_traceback(message, category, filename, lineno, file=None, line=None):

    log = file if hasattr(file,'write') else sys.stderr
    traceback.print_stack(file=log)
    log.write(warnings.formatwarning(message, category, filename, lineno, line))

warnings.showwarning = warn_with_traceback

この後、すべての警告は警告メッセージと同様にスタックトレースを表示します。ただし、警告が最初のものでないために無視された場合は、何も起こらないので、まだ実行する必要があることを考慮に入れておいてください。

warnings.simplefilter("always")


のようなコントロールを得ることができます。 numpy.seterr が与えるものと同様の制御を warning モジュールのフィルタを通して与えます。

もし、python が最初に起動したときだけでなく、起動するたびに警告を報告するようにしたい場合は、次のようなものを含めることができます。

import warnings
warnings.simplefilter("always")

引数として異なる文字列を渡すことで、他の動作を得ることができます。同じ関数を使って、警告を発生させたモジュール、提供するメッセージ、警告クラス、原因となったコードの行などに応じて、警告のために異なる動作を指定することもできます...

のリストを確認することができます。 モジュールドキュメント

例として、すべての警告で例外を発生させるように設定することができます。 DeprecationWarnings を除いて例外を発生させることができます。

import warnings
warnings.simplefilter("error")
warnings.simplefilter("ignore", DeprecationWarning)

この方法では、エラーとして発生した各警告について完全なトレースバックを得ることができます(実行が停止するため、最初のものだけですが...)、一つずつ対処し、二度と聞きたくないものを無視するフィルタを作成できます...。