I am making an addon to launch background rendering in GUI. I want to use subprocess.Popen to execute blender with -b. And here is my code:

import bpy
import subprocess
import multiprocessing

FILE = "test.blend"

class Background_Render(bpy.types.Operator):
    """call blender in background"""
    bl_idname = "render.back_render"
    bl_label = "Render in Background"

    def execute(self, context):
        task = multiprocessing.Process(target=self.render_task, args=(context, ))
        return {"FINISHED"}

    def render_task(self, context):
        argument = ['blender', '-b', FILE, '-f', '1']
        process_handle = subprocess.Popen(
            stdout = subprocess.PIPE,
        for line in iter(process_handle.stdout.readline, b''):
            print(line.rstrip().decode()) # print for debug
            # both below not work
            context.area.header_text_set(line.rstrip().decode()) # show info in GUI
        context.area.header_text_set() # set empty after finish

My first approach is run Popen or say render_task directly, however blender will freeze when I start the job. So I commented it away. And I added the call to a multiprocessing.Process. It not get freezed. Unfortunately, string can be print into terminal but not into GUI with context.area.header_text_set or Operator.report.

What is the best practice to show data in multiprocess? And why they are not showing?


Inter process communication solutions between Blender 's window manager and event system and another process are tricky at best: not impossible, quite possible, but requires extra effort.

ideasman42 has an excellent solution presented at blender.stackexchange.com/q/45731/228


Your Answer

By clicking “Post Your Answer”, you agree to our terms of service, privacy policy and cookie policy

Not the answer you're looking for? Browse other questions tagged or ask your own question.