💡
【Maya】開発中のPythonの変更を即時反映する
概要
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