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

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

このブログの人気の投稿

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

パズドラ 転生龍刀士降臨周回編成 (ベア戦)

パズドラ HUNTER☓HUNTER キメラアント周回編成 (ペア戦)