I have a script that copies an animation from one armature to another. I found it on StackOverflow (https://blender.stackexchange.com/a/75450/114821). This script runs perfectly in GUI mode. It is not particular about the state of the interface; that is, it selects the correct objects and modes so that the operators have the correct context.
However, when I run this script in headless mode it fails:
Traceback (most recent call last):
File "D:\Synthetic Hand\3D hand 7.blend\makeclip.py", line 67, in <module>
File "<string>", line 71, in apply_mocap
File "<string>", line 46, in apply_animation
File "C:\Program Files\Blender Foundation\Blender 2.91\2.91\scripts\modules\bpy\ops.py", line 132, in __call__
ret = _op_call(self.idname_py(), None, kw)
RuntimeError: Operator bpy.ops.anim.keyframe_insert_menu.poll() failed, context is incorrect
The function that throws the error is below. The line that throws the error is the last in this function.
def apply_animation():
global source, target, frame_from, frame_to
#set keying set to whole character
#we have all bones selected
scene = bpy.context.scene
for frame in range(frame_from, frame_to ):
scene.frame_current = frame
scene.frame_set(scene.frame_current)
# apply visual transfrom to pose Ctrl+A
bpy.ops.pose.visual_transform_apply()
# insert all keyframes -> press I
bpy.ops.anim.keyframe_insert_menu(type='__ACTIVE__', confirm_success=True)
I realize the call to keyframe_insert_menu
refers to a GUI control, which is not available in the headless mode. What’s another away to accomplish the same thing?