web-dev-qa-db-ja.com

警告のトレースバックを取得する

Numpyでは np.seterr(invalid='raise') を実行して、代わりにエラーを発生させる警告のトレースバックを取得できます( this post を参照)。

  • 警告をトレースする一般的な方法はありますか?
  • 警告が発生したときにトレースバックを提供するためにpythonを作成できますか?
49
embert

warnings.showwarningに割り当てることで、必要なものを取得できます。 warnings module documentation 自体はあなたがそうすることを推奨しているので、ソースのダークサイド。 :)

warnings.showwarningに割り当てることにより、この関数を別の実装に置き換えることができます。

warning.showwarning normalyが行うことと、さらにスタックを出力することを行う新しい関数を定義できます。次に、元の代わりに配置します:

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.seterrwarningモジュールのフィルターを介して提供する同様のコントロールを取得できます。

必要なものがpythonであり、最初だけでなくトリガーされるたびにすべての警告を報告する場合は、次のようなものを含めることができます。

import warnings
warnings.simplefilter("always")

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

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

例として、完全に無視する必要があるDeprecationWarningsを除くすべての警告を設定して例外を発生させることができます。

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

この方法では、エラーとして発生した各警告の完全なトレースバックを取得します(実行は停止するため、最初の警告のみです...しかし、それらを1つずつ対処し、聞きたくないものを無視するフィルターを作成できます)再び...

61
mgab

プログラムを次のように実行します

python -W error myprogram.py

これにより、すべての警告が致命的になります。詳細については here を参照してください

17
Jakob Bowyer