💡

【Maya】開発中のPythonの変更を即時反映する

2023/12/25に公開

概要

Mayaでのツール開発時にPythonスクリプトをリロードしてる方法を共有します。

my_namespace.src.ui のような階層にスクリプトを置いていたとした、my_namespaceを指定するとmy_namespace配下のスクリプトが全てリロードされます。
DEFAULT_RELOAD_PACKAGESに予めリロード対象のnamespaceを入れておくと、指定しなくても毎回リロードします。

環境: Maya2024

unload_packages(silent=False, packages=["my_namespace"])

unload_packages.py 全体コード

import sys

DEFAULT_RELOAD_PACKAGES = [] 

def unload_packages(silent=True, packages=None):
    if packages is None:
        packages = DEFAULT_RELOAD_PACKAGES

    # construct reload list
    reloadList = []
    for i in sys.modules.keys():
        for package in packages:
            if i.startswith(package):
                reloadList.append(i)

    # unload everything
    for i in reloadList:
        try:
            if sys.modules[i] is not None:
                del(sys.modules[i])
                if not silent:
                    print("Unloaded: %s" % i)
        except:
            print("Failed to unload: %s" % i)
                        
unload_packages(silent=False, packages=["my_namespace"])

UI部分だけ更新するときは毎回ウインドウを開き直すと思うので、

scripts.src.ui.simple_window
importlib.reload(simple_window)
simple_window.open()

のようにやってれば、シンプルな構成であれば開き直すと更新されるので、こちらも仕込んでおくとスムーズです。importlib.reloadだと複雑なインポート構成の場合にも対応できないので大きめのライブラリとかUI以外のスクリプトをリロードするときはunload_packages.pyのようにすると良いと思います。

Discussion