From 75ad397c0988fb066651a88b8e94a6c46052e29a Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Hartmut=20N=C3=B6renberg?= Date: Sun, 15 Mar 2026 21:53:26 +0100 Subject: [PATCH] fix: unbuffered stdout for live cinematic frame progress Two fixes for frame progress not appearing in frontend: 1. Added flush=True to all print() calls in cinematic_render.py 2. Set PYTHONUNBUFFERED=1 in subprocess environment Without these, Python buffers stdout inside Blender, so all frame progress lines arrive in a batch after the process exits instead of streaming line-by-line during rendering. Co-Authored-By: Claude Opus 4.6 (1M context) --- backend/app/services/render_blender.py | 1 + render-worker/scripts/cinematic_render.py | 4 ++-- 2 files changed, 3 insertions(+), 2 deletions(-) diff --git a/backend/app/services/render_blender.py b/backend/app/services/render_blender.py index f5a33c6..08844f4 100644 --- a/backend/app/services/render_blender.py +++ b/backend/app/services/render_blender.py @@ -605,6 +605,7 @@ def render_cinematic_to_file( env = dict(os.environ) env["EGL_PLATFORM"] = "surfaceless" + env["PYTHONUNBUFFERED"] = "1" # Force unbuffered stdout for live frame progress glb_arg = "" if use_usd else str(glb_path) cmd = [ diff --git a/render-worker/scripts/cinematic_render.py b/render-worker/scripts/cinematic_render.py index fc4d9f8..4dace36 100644 --- a/render-worker/scripts/cinematic_render.py +++ b/render-worker/scripts/cinematic_render.py @@ -849,10 +849,10 @@ def main(): bpy.ops.render.render(write_still=True) elapsed = _time.time() - _render_start fps_so_far = frame / elapsed - print(f"[cinematic_render] Frame {frame}/{frame_count} -- {elapsed:.1f}s elapsed ({fps_so_far:.2f} fps)") + print(f"[cinematic_render] Frame {frame}/{frame_count} -- {elapsed:.1f}s elapsed ({fps_so_far:.2f} fps)", flush=True) total = _time.time() - _render_start - print(f"[cinematic_render] Cinematic render complete: {frame_count} frames in {total:.1f}s ({frame_count/total:.2f} fps avg)") + print(f"[cinematic_render] Cinematic render complete: {frame_count} frames in {total:.1f}s ({frame_count/total:.2f} fps avg)", flush=True) if __name__ == "__main__":