[Blender3.3] Pythonプログラムのトレース情報の出力
Pythonにはデバッガもありますが、簡単にデバッグしようとする際には、トレース出力できると便利です。
Pythonの中身の調査を兼ねて、トレース出力用のクラス(Trace)を作ってみました。
Blenderのテキストエディタで以下の内容を打ち込み、ファイル名 "trace.py" で保存します。
import inspect class Trace: activated = False def on(): Trace.activated = True def off(): Trace.activated = False def print(*argv, **kwargv): if (Trace.activated): stack = inspect.stack() traceback = inspect.getframeinfo(stack[1][0]) print('%s:%d %s: ' % (traceback.filename, traceback.lineno, traceback.function), end="") print(*argv, **kwargv) if __name__ == "__main__": import datetime now = datetime.datetime.now() print("** test start at %s **" % now) print("test 1") Trace.print("trace print, False") print("test 2") Trace.on() Trace.print("trace print, True") Trace.print("1", "2", sep=", ") value=100 Trace.print("value=%d." % value) value2=200 Trace.print("value=%d, value2=%d." % (value, value2)) print("test 3") def test3(): Trace.print("text in test3()") test3()
ここで、if __name__ 以降はテスト用のコードです。
以前、__name__について調べたときに、テキストエディタ内で起動すると__name__の値が __main__ となることを確認したので、その性質を利用したものです。
また、テスト時以外はトレース出力しないよう、デフォルトでは出力せず、Trace.on()以降のみ出力するとしました。
これをテキストエディタの中で、Alt+Pで実行してみると、コンソールに下記が出力されます。
** test start at 2022-11-13 17:45:11.583156 ** test 1 test 2 \trace.py:31 <module>: trace print, True \trace.py:32 <module>: 1, 2 \trace.py:34 <module>: value=100. \trace.py:36 <module>: value=100, value2=200. test 3 \trace.py:41 test3: text in test3()
Trace.on()にして以降のTrace.print()のみ出力されていること、トレース出力にファイル名、行番号、関数名(どうやらテキストエディタ内だと<module>になるみたい)が表示されていることが確認できます。