关于 blender-python-scripting
面向开发者的 Blender 5.x Python 脚本技能,涵盖插件、自动化和场景工具开发。它提供 API 模板与数据模型参考,并优先通过 MCP 检查和修改运行中的 Blender。
主要功能
- 01操作器、面板与插件模式
- 02属性、处理器和计时器指南
- 03上下文管理与调试
- 04批量处理示例
- 05Blender 数据模型参考
适用场景
- 01创建自定义 Blender 操作器或面板
- 02开发 Blender 5.x 插件
- 03批量处理文件或渲染任务
- 04排查操作器的上下文错误
MCP 相关
连接官方 Blender MCP 服务时,可在运行中的 Blender 会话中检查场景、执行脚本并验证视觉结果;未连接时则改为生成 Python 脚本。
安装
复制下面的命令,在终端中运行。
npx skills add https:/ / github.com/ ra100/ blender-claude-plugin --skill blender-python-scripting安装后在 Claude Code 中输入/blender-python-scripting确认已加载。
附带文件references/data_model_reference.mdreferences/python_api.md
详细介绍
Blender Python 脚本专家
概述
此技能为 Blender 5.x Python 脚本编写提供专家指导:编写自定义操作器、构建 UI 面板、开发插件、管理上下文、使用处理器和计时器、处理属性系统、进行批处理,以及访问 Blender 的数据模型。参考文件包含完整模板和数据模型层级结构。
MCP 优先方法
执行脚本、检查数据块,以及直接在运行中的 Blender 会话里修改场景状态时,优先使用 官方 Blender MCP 服务(Blender Lab,Blender 5.1+)。只有在 MCP 服务未连接时,才退而使用输出 Python 脚本的方式。
**检测:**会话开始时,查找名称与 execute_blender_code、get_objects_summary 或 search_api_docs 匹配的工具——这些工具属于官方 blender-mcp 服务。如果找到其中任何一个,即表示 MCP 可用。
此技能使用的工具:
execute_blender_code— 在实时会话中运行bpyPython(主要操作)get_objects_summary、get_object_detail_summary— 修改前检查场景状态get_blendfile_summary_datablocks/_missing_files/_of_linked_libraries/_path_info/_usage_guess— 检查文件内容search_api_docs、get_python_api_docs、search_manual_docs— 调用前确认正确的 API/操作器名称get_screenshot_of_window_as_image/_as_json、get_screenshot_of_area_as_image— 验证视觉效果jump_to_tab_by_name、jump_to_tab_by_space_type、jump_to_view3d_object_by_name、jump_to_view3d_object_data_by_name— 操控 UI,让修改效果可见render_thumbnail_to_path、render_viewport_to_path— 获取快速视觉反馈
**工作流:**使用 get_* / search_* 工具检查 → 通过 execute_blender_code 修改 → 使用截图或摘要工具验证。代码块应保持简短且可幂等执行,以便轻松定位故障。
设置方法:参见 docs/blender-mcp-setup.md。
任务决策树
- “创建自定义操作器” -> 参阅
references/python_api.md中的操作器模板 - “构建 UI 面板” -> 查看
references/python_api.md中的面板模板 - “开发 Blender 插件” -> 按照下方的插件结构部分操作
- “批量处理文件/渲染” -> 查看批处理模式
- “访问场景/对象数据” -> 参阅
references/data_model_reference.md - “注册属性” -> 查看
references/python_api.md中的属性系统 - “在帧更改/文件加载时运行代码” -> 查看
references/python_api.md中的处理器模式 - “上下文错误/poll 失败” -> 查看下方的上下文管理
Blender 5.1 Python 变更
Python 3.13 升级
- Blender 5.1 内置 Python 3.13(Blender 5.0 内置的是 3.12)
- 在插件中将
bl_info["blender"]更新为(5, 1, 0),以进行版本限制 - 使用类型提示语法(
int | None,而非Optional[int])——现已完全支持 - CPython 3.13 的性能改进:函数调用更快,GC 更出色
已移除的操作器
bpy.ops.anim.convert_legacy_action— 已移除;分层动作会自动处理此事
API 新增内容
bpy.ops.pose.apply_to_basis()— 将当前姿势烘焙为静止姿势- 节点插槽类型:用于字体数据的
NodeSocketFont - 几何节点的体积网格节点类型(参见 blender-geometry-nodes 技能)
插件结构
规范的 Blender 插件采用以下布局:
my_addon/
├── __init__.py # bl_info, register(), unregister()
├── operators.py # Custom operators
├── panels.py # UI panels
├── properties.py # PropertyGroups
├── preferences.py # AddonPreferences (optional)
└── utils.py # Shared utilities
最小单文件插件
bl_info = {
"name": "My Add-on",
"author": "Author",
"version": (1, 0, 0),
"blender": (5, 0, 0),
"location": "View3D > Sidebar > My Tab",
"description": "Short description",
"category": "Object",
}
import bpy
class MY_OT_my_operator(bpy.types.Operator):
bl_idname = "my.my_operator"
bl_label = "My Operator"
bl_options = {'REGISTER', 'UNDO'}
@classmethod
def poll(cls, context):
return context.active_object is not None
def execute(self, context):
# ... do work ...
return {'FINISHED'}
class MY_PT_my_panel(bpy.types.Panel):
bl_label = "My Panel"
bl_idname = "MY_PT_my_panel"
bl_space_type = 'VIEW_3D'
bl_region_type = 'UI'
bl_category = "My Tab"
def draw(self, context):
layout = self.layout
layout.operator("my.my_operator")
classes = (MY_OT_my_operator, MY_PT_my_panel)
def register():
for cls in classes:
bpy.utils.register_class(cls)
def unregister():
for cls in classes:
bpy.utils.unregister_class(cls)
if __name__ == "__main__":
register()
命名约定
- 操作器:
ADDON_OT_name→bl_idname = "addon.name" - 面板:
ADDON_PT_name - 菜单:
ADDON_MT_name - UILists:
ADDON_UL_name - PropertyGroups:
ADDON_PG_name(约定俗成,并非强制) - 标题栏:
ADDON_HT_name
上下文管理
常见上下文问题
Blender 操作依赖当前上下文(活动对象、模式、区域类型)。许多 bpy.ops.* 调用在上下文不正确时会失败。
规则:调用运算符前始终检查上下文。使用 poll() 方法为运算符添加保护。
上下文覆盖(Blender 4.x+ / 5.x)
# Modern context override using temp_override (4.0+)
with bpy.context.temp_override(active_object=obj, selected_objects=[obj]):
bpy.ops.object.delete()
# Override with area/region for UI-dependent ops
area = next(a for a in bpy.context.screen.areas if a.type == 'VIEW_3D')
region = next(r for r in area.regions if r.type == 'WINDOW')
with bpy.context.temp_override(area=area, region=region):
bpy.ops.view3d.camera_to_view()
模式切换
# Safe mode switch
if bpy.context.object and bpy.context.object.mode != 'EDIT':
bpy.ops.object.mode_set(mode='EDIT')
# Always return to object mode when done
bpy.ops.object.mode_set(mode='OBJECT')
常见上下文问题
- 后台模式下的
bpy.ops:许多视口运算符在--background模式下会失败。请改用直接数据 API(bpy.data.*)。 - 处理程序中的运算符上下文:处理程序在常规上下文之外运行。请使用
bpy.context.temp_override(),或避免在处理程序中使用bpy.ops。 - 活动对象为 None:操作前始终检查
context.active_object is not None。 - 模式错误:对象模式运算符在编辑模式下会失败,反之亦然。请检查
context.object.mode。 - 依赖图未更新:修改数据后,如有需要,请调用
bpy.context.view_layer.update()或depsgraph.update()。 display_type的取值取决于对象类型:'PLAIN_AXES'仅适用于空物体。网格对象使用'BOUNDS'、'WIRE'、'SOLID'或'TEXTURED'。
批处理
批量渲染
import bpy, os
scenes_dir = "/path/to/blend/files"
output_dir = "/path/to/output"
for filename in os.listdir(scenes_dir):
if filename.endswith(".blend"):
filepath = os.path.join(scenes_dir, filename)
bpy.ops.wm.open_mainfile(filepath=filepath)
bpy.context.scene.render.filepath = os.path.join(
output_dir, filename.replace(".blend", ".png")
)
bpy.ops.render.render(write_still=True)
批量处理对象
import bpy
for obj in bpy.data.objects:
if obj.type == 'MESH':
# Select only this object
bpy.ops.object.select_all(action='DESELECT')
obj.select_set(True)
bpy.context.view_layer.objects.active = obj
# Apply all modifiers
for mod in obj.modifiers:
bpy.ops.object.modifier_apply(modifier=mod.name)
命令行批处理
blender --background scene.blend --python my_script.py
blender --background --python batch_render.py -- --input /files --output /renders
在 -- 后访问自定义参数:
import sys
argv = sys.argv[sys.argv.index("--") + 1:]
调试技巧
- 系统控制台:选择 Window > Toggle System Console(Windows),或从终端运行 Blender
- Python 控制台:打开 Python 控制台编辑器区域,以便交互式测试
- 信息编辑器:显示 GUI 操作对应的 Python 代码,可用于查找 API 调用
dir()和help():在 Python 控制台中使用,以探索 API 对象bpy.context.copy():返回当前上下文的字典,以供检查- 模态运算符中的错误:添加
print()语句,或在异常处理程序中使用traceback.print_exc()
属性系统快速参考
| 类型 | 注册 | 取值 |
|---|---|---|
BoolProperty | bpy.props.BoolProperty() | True/False |
IntProperty | bpy.props.IntProperty() | min、max、default、step |
FloatProperty | bpy.props.FloatProperty() | min、max、default、precision |
StringProperty | bpy.props.StringProperty() | default、maxlen、subtype |
EnumProperty | bpy.props.EnumProperty() | items=[(id, name, desc)] |
FloatVectorProperty | bpy.props.FloatVectorProperty() | size、default、subtype |
IntVectorProperty | bpy.props.IntVectorProperty() | size、default |
BoolVectorProperty | bpy.props.BoolVectorProperty() | size、default |
PointerProperty | bpy.props.PointerProperty() | type=PropertyGroup |
CollectionProperty | bpy.props.CollectionProperty() | type=PropertyGroup |
属性子类型
- Float/Int:
'PIXEL'、'PERCENTAGE'、'FACTOR'、'ANGLE'、'TIME'、'DISTANCE' - FloatVector:
'COLOR'、'TRANSLATION'、'DIRECTION'、'VELOCITY'、'ACCELERATION'、'EULER'、'QUATERNION'、'XYZ' - String:
'FILE_PATH'、'DIR_PATH'、'FILE_NAME'、'BYTE_STRING'、'PASSWORD'
Python API 参考
有关完整模板(包括运算符:基本、模态、文件对话框、带属性调用;面板:条件式、子面板、可折叠;PropertyGroup、处理程序、计时器、键位映射和上下文覆盖),请参阅 references/python_api.md。
数据模型参考
有关完整的 Blender 数据层级(bpy.data.*)、ID 类型、对象类型、网格/曲线/骨架数据访问模式以及依赖图用法,请参阅 references/data_model_reference.md。