見出し画像

Blenderのモジュールのフォルダ内を自動で再読み込み  

BLENDERの再読み込み問題


Blenderは通常のコードだと別のフォルダやファイルの場合は自動で読み込むことはありません。

ブレンダーの初回の立ち上げのみモジュールは読み込まれ、それ以降はリロードされても初期化ファイル__init__.py以外は読み込まれないのです。

コードが長くなったり使い回すコードが多い場合において、分割したい場合は非常に不便です。

■対策のメソッド

__init__.py

 def reload_unity_modules(name, debug=False):
    import os
    import importlib
   
    utils_modules = sorted([name[:-3] for name in os.listdir(os.path.join(__path__[0], "utils")) if name.endswith('.py')])

    for module in utils_modules:
        impline = "from . utils import %s" % (module)
        if debug == True:
            print("##UTILS RELOAD %s" % (".".join([name] + ['utils'] + [module])))

        exec(impline)
        importlib.reload(eval(module))

これでは都合が悪いので、上記のメソッドを最初のアドオン初期化ファイル __init__.pyに仕込みます。

仮に、下記の様なフォルダ構造として、file1やfile2などがリロードするたびに呼び出されます。

■フォルダの構成


├── __init__.py
└── utils
    ├── file1.py
    ├── file2.py

実際の呼び出し部分はこちらになります。これを __init__.pyに仕込みます。

■読み出し部分

__init__.py

if 'bpy' in locals():
    reload_unity_modules(bl_info['name'])

■リロードの方法

リロードオペレーターを押すたびに、
utilsフォルダ内のファイルが自動でリロードされるようになります。

お気に入り登録などしてみましょう。

リロード後、コンソール画面でリロードされたモジュールが読みこまれている事が確認出来ます。
デバックが必要ない場合は、
プリント文はコメントアウトか
メソッドの
reload_unity_modules(name, debug=False)
でdebugをTrueに
してもらっても構いません。