[Blender3.3] pythonでの__name__について

 Blenderのアドオンでは、常に以下の文を入れるようにとされています。

if __name__ == "__main__":
    register()

記事によっては、この2行はおまじないのように書かれていますが、そこはきちんと把握しておきたいのが人情というもの。この __name__ の値がいつどういう値になるのかを調べてみます。

まず、コンソール付きで起動したBlenderの中でテキストエディターを開き、以下の一行だけを入力します。

print("This is '" + __name__ + "'.")

この状態で「テキスト>スクリプト実行」あるいはalt+pを押下すると、以下の行がコンソールに現れます。

This is '__main__'.

つまり、テキストエディターの中でスクリプト実行するときには __name__ の値は __main__ になっているということが分かりました。

では、次に中身のないアドオンを一つ作ります。今回の目的からすれば、内容はなんでも構わないわけなので、一番簡単に、以下の通りのものを test_print.py として作成しました。

  
bl_info = {
    "name": "Test Print",
    "author": "Shiki Kuraga",
    "version": (1, 0),
    "blender": (3, 3, 0),
    "location": "none",
    "description": "Test Print in Add-on",
    "warning": "",
    "support": "TESTING",
    "doc_url": "",
    "category": "object",
}


import bpy

def register():
    print("register in '" + __name__ + "'")

def unregister():
    print("unregister in '" + __name__ + "'")

print("This is '" + __name__ + "'.")
if __name__ == "__main__":
    register()

これを先程と同じようにテキストエディターの中でスクリプト実行(alt+p)すれば、__name__ が __main__ なので、register()が実行されるのは分かります。

だとしたときに、このアドオンをインストールしたらどうなるでしょうか。それを試してみたいと思います。

プリファレンスから、アドオンの画面を出して、インストール。すると、アドオンの画面に、Test Printが表示され、インストールが成功したことが確認できます。


ただ、この段階では Test Printのアドオンは無効の状態です。
そこで、object: Test Printの左の□をチェックして、有効化します。


このとき、コンソールに以下の文字列が表示されました。
This is 'test_print'.
register in 'test_print'

つまり、アドオンとして読み込まれるときも、register()が呼ばれるときも、__name__ は、__main__ではなくて、test_printになるようです。

となると、
if __name__ == "__main__":
    register()

の一行は、テキストエディターの中でスクリプト実行する際にregister()するためのものという理解になるのですけど、合っているのでしょうか。

このブログの人気の投稿

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

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

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