Opening .blend files using Blender's Python API
Asked Answered
B

1

16

I'm trying to make an automated build system for Blender 2.73 which reads XML files with lots of paths, opens the files one by another and then renders them.

I'm using the following code in order to open:

bpy.ops.wm.open_mainfile("file_path")

My problem is that I get the following error:

Traceback (most recent call last):
  File "<blender_console>", line 1, in <module>
  File "<BLENDER_PATH>/scripts/modules/bpy/ops.py", line 186, in __call__
    ret = op_call(self.idname_py(), C_dict, kw, C_exec, C_undo)
TypeError: Calling operator "bpy.ops.wm.open_mainfile" error, expected a string enum in ('INVOKE_DEFAULT', 'INVOKE_REGION_WIN', 'INVOKE_REGION_CHANNELS', 'INVOKE_REGION_PREVIEW', 'INVOKE_AREA', 'INVOKE_SCREEN', 'EXEC_DEFAULT', 'EXEC_REGION_WIN', 'EXEC_REGION_CHANNELS', 'EXEC_REGION_PREVIE)
Berry answered 21/1, 2015 at 19:47 Comment(0)
U
22

The issue with your operator call is that it doesn't accept positional arguments, you need to name each argument -

bpy.ops.wm.open_mainfile(filepath="file_path")

Blender only allows one open file at a time, when you open another blend file the existing data is flushed out of ram, this normally includes the script you are running.

If you have a look at bpy.app.handlers, you can setup a handler to be persistent, in that it will remain in memory after loading a new blend file. This can allow you to run your code after the new blend file is opened.

import bpy
from bpy.app.handlers import persistent

@persistent
def load_handler(dummy):
    print("Load Handler:", bpy.data.filepath)

bpy.app.handlers.load_post.append(load_handler)

You may also want to consider doing the main work outside of blender, loop through each file and tell blender to open and render each file.

blender --background thefile.blend -a

will render an animation based on settings in the blend file.

For more control you can also specify a python script to be run once the blend file is opened. This question can expand on that for you.

Unmannered answered 22/1, 2015 at 7:42 Comment(3)
How do I then open the file? The error stays as it is. I think you just solved my next problem after opening, but right now it even fails opening the file.Berry
@Unmannered the link to "open and render each file" is deadExceeding
@Exceeding that should be the 2.79 page of what the old link was.Unmannered

© 2022 - 2024 — McMap. All rights reserved.