You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

Python子进程调用Blender如何将脚本生成的变量返回至调用函数?

实现Blender子进程返回numpy数组到主进程

主进程与Blender子进程属于独立进程,内存不共享,无法直接通过return传递变量。需要通过标准输出(stdout)传递序列化后的数组数据,主进程捕获输出后反序列化还原numpy数组,具体实现步骤如下:

1. 修改Blender脚本,输出序列化后的数组

Blender脚本以独立程序运行,return语句无效,需将numpy数组转为可序列化格式(如JSON或二进制)后输出到标准输出。以下是JSON格式的实现示例(简单易读、兼容性好):

# blender_script.py
import bpy
import numpy as np
import json
import sys

# 生成目标numpy数组
result_arr = np.array([1, 2, 3])

# 将数组转为列表后序列化为JSON字符串,输出到stdout
print(json.dumps(result_arr.tolist()))

# 可选:将Blender自身日志重定向到stderr,避免干扰数据解析
sys.stderr.write("Blender脚本执行完成\n")

2. 主进程捕获并解析输出

主进程调用Blender时,通过subprocess.run捕获标准输出,再解析JSON字符串还原为numpy数组:

import subprocess
import json
import numpy as np

# 调用Blender并捕获输出
proc_result = subprocess.run(
    ["blender", "-b", "-P", "blender_script.py"],
    capture_output=True,  # 同时捕获stdout和stderr
    text=True  # 以文本模式读取输出,适配JSON格式
)

# 检查子进程执行状态
if proc_result.returncode == 0:
    # 解析stdout中的JSON字符串,转为numpy数组
    arr_list = json.loads(proc_result.stdout.strip())
    final_arr = np.array(arr_list)
    print("获取到的numpy数组:", final_arr)
else:
    # 打印错误信息
    print("Blender脚本执行失败,错误信息:", proc_result.stderr)

可选:二进制格式传递(适合大型数组)

若数组规模较大,JSON序列化效率较低,可使用numpy二进制格式传递:

Blender脚本修改:

# blender_script.py
import bpy
import numpy as np
import sys

result_arr = np.array([1, 2, 3], dtype=np.int64)
# 将数组以二进制格式写入stdout
result_arr.tofile(sys.stdout.buffer)

主进程解析:

import subprocess
import numpy as np

proc_result = subprocess.run(
    ["blender", "-b", "-P", "blender_script.py"],
    capture_output=True
)

if proc_result.returncode == 0:
    # 从二进制数据还原数组,需保证dtype与Blender脚本中一致
    final_arr = np.frombuffer(proc_result.stdout, dtype=np.int64)
    print("获取到的numpy数组:", final_arr)
else:
    print("Blender脚本执行失败,错误信息:", proc_result.stderr.decode('utf-8'))

内容的提问来源于stack exchange,提问作者ssuraj

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.07.16 01:11:15