[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 として作成しました。

  1. bl_info = {
  2. "name": "Test Print",
  3. "author": "Shiki Kuraga",
  4. "version": (1, 0),
  5. "blender": (3, 3, 0),
  6. "location": "none",
  7. "description": "Test Print in Add-on",
  8. "warning": "",
  9. "support": "TESTING",
  10. "doc_url": "",
  11. "category": "object",
  12. }
  13.  
  14.  
  15. import bpy
  16.  
  17. def register():
  18. print("register in '" + __name__ + "'")
  19.  
  20. def unregister():
  21. print("unregister in '" + __name__ + "'")
  22.  
  23. print("This is '" + __name__ + "'.")
  24. if __name__ == "__main__":
  25. 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()するためのものという理解になるのですけど、合っているのでしょうか。

このブログの人気の投稿

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

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

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