[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>になるみたい)が表示されていることが確認できます。