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
相关产品推荐
相关产品推荐

