目标
- [x] 解析Blender插件代码加载原理, 为测试做准备
结论
采用方法3的方式, 可以在测试中保证重新加载子模块, 是想要的方式, 代码如下:
_qk_locals = locals()
def register():
if "bpy" in _qk_locals:
print(">>> plugin's submodules reload")
from importlib import reload
_modules_loaded[:] = [reload(val) for val in _modules_loaded]
del reload
from bpy.utils import register_class
for mod in _modules_loaded:
for cls in mod.classes:
print('>>> register: ', cls.__name__)
register_class(cls)
Blender插件加载分析
本分析基于Blender2.79b.
分析方法
- 在用户Blender插件目录下创建插件包
我的测试插件为C:\Users\yaoyu\AppData\Roaming\Blender Foundation\Blender\2.79\scripts\addons\qk_modeler
- 在
__init__.py
文件中插入输出代码, 查看效果 - 在Blender用户配置的"Add-ons"界面中, 勾选插件.
试验
1 init.py模块加载
if "bpy" in locals():
print('reload...')
from importlib import reload
_modules_loaded[:] = [reload(val) for val in _modules_loaded]
del reload
现象: 判断块内代码在反复勾选中, 没有触发
原因: "bpy" in locals() -> False
2 在1的基础上, 修改__init__.py文件代码
现象: 判断块内代码在第一次重勾选时触发
原因: "bpy" in locals() -> True
在__init__.py代码修改之后, 模块第一次重加载时会触发.
3 修改__init__.py模块之register()函数
_qk_locals = locals()
def register():
if "bpy" in _qk_locals:
print(">>> plugin's submodules reload")
from importlib import reload
_modules_loaded[:] = [reload(val) for val in _modules_loaded]
del reload
from bpy.utils import register_class
for mod in _modules_loaded:
for cls in mod.classes:
print('>>> register: ', cls.__name__)
register_class(cls)