[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が表示され、インストールが成功したことが確認できます。
This is 'test_print'. register in 'test_print'
つまり、アドオンとして読み込まれるときも、register()が呼ばれるときも、__name__ は、__main__ではなくて、test_printになるようです。
if __name__ == "__main__": register()
の一行は、テキストエディターの中でスクリプト実行する際にregister()するためのものという理解になるのですけど、合っているのでしょうか。