[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()するためのものという理解になるのですけど、合っているのでしょうか。

