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