[Blender3.3] Pythonプログラムのトレース情報の出力

Pythonにはデバッガもありますが、簡単にデバッグしようとする際には、トレース出力できると便利です。

Pythonの中身の調査を兼ねて、トレース出力用のクラス(Trace)を作ってみました。

Blenderのテキストエディタで以下の内容を打ち込み、ファイル名 "trace.py" で保存します。

  1. import inspect
  2.  
  3. class Trace:
  4. activated = False
  5.  
  6. def on():
  7. Trace.activated = True
  8.  
  9. def off():
  10. Trace.activated = False
  11. def print(*argv, **kwargv):
  12. if (Trace.activated):
  13. stack = inspect.stack()
  14. traceback = inspect.getframeinfo(stack[1][0])
  15. print('%s:%d %s: ' % (traceback.filename, traceback.lineno, traceback.function), end="")
  16. print(*argv, **kwargv)
  17. if __name__ == "__main__":
  18. import datetime
  19.  
  20. now = datetime.datetime.now()
  21. print("** test start at %s **" % now)
  22. print("test 1")
  23. Trace.print("trace print, False")
  24.  
  25. print("test 2")
  26. Trace.on()
  27. Trace.print("trace print, True")
  28. Trace.print("1", "2", sep=", ")
  29. value=100
  30. Trace.print("value=%d." % value)
  31. value2=200
  32. Trace.print("value=%d, value2=%d." % (value, value2))
  33. print("test 3")
  34. def test3():
  35. Trace.print("text in test3()")
  36. 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>になるみたい)が表示されていることが確認できます。

関連記事: [Blender3.3] Pythonスクリプトの読み込みフォルダを追加したい

このブログの人気の投稿

パズドラ 12月のクエスト(Lv12) ネフティスさん、出番です

日本酒 烏輪 緑のたいよう 純米酒 無濾過生原酒

[Blender3.3] mmd_toolsはどれが最新?