From da935926c7da856d25483c0ec496d68ca8b07f9a Mon Sep 17 00:00:00 2001 From: ud18010 Date: Thu, 16 Jul 2026 10:32:55 +0800 Subject: [PATCH] =?UTF-8?q?ModelTranslator:=20=E5=85=B1=E4=BA=AB=20Blender?= =?UTF-8?q?=20=E8=BF=90=E8=A1=8C=E5=99=A8=20mt=5Frun.py?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- Tools/ModelTranslator/mt_run.py | 36 +++++++++++++++++++++++++++++++++ 1 file changed, 36 insertions(+) create mode 100644 Tools/ModelTranslator/mt_run.py diff --git a/Tools/ModelTranslator/mt_run.py b/Tools/ModelTranslator/mt_run.py new file mode 100644 index 00000000..3e7bc0f2 --- /dev/null +++ b/Tools/ModelTranslator/mt_run.py @@ -0,0 +1,36 @@ +"""find_blender / run_blender_script:model_decimate 与 model_bake 共享的 +headless Blender 运行器(与 model_translator.py 同模式,脚本名与参数泛化)。""" +import json +import os +import shutil +import subprocess +import sys + +DEFAULT_BLENDER = r"D:\tools\blender-5.0.0-windows-x64\blender.exe" +HERE = os.path.dirname(os.path.abspath(__file__)) + + +def find_blender(cli_arg): + for cand in (cli_arg, os.environ.get("BLENDER_EXE"), DEFAULT_BLENDER, + shutil.which("blender")): + if cand and os.path.isfile(cand): + return cand + sys.exit("找不到 blender.exe,请用 --blender 指定或设置环境变量 BLENDER_EXE") + + +def run_blender_script(blender, script, script_args): + """跑 HERE 下的 bl_*.py,返回 MT_SUMMARY JSON;失败或 summary 带 error 则退出。""" + cmd = [blender, "-b", "--factory-startup", + "--python", os.path.join(HERE, script), "--"] + list(script_args) + proc = subprocess.run(cmd, capture_output=True, text=True, encoding="utf-8", + errors="replace") + summary = None + for line in (proc.stdout or "").splitlines(): + if line.startswith("MT_SUMMARY "): + summary = json.loads(line[len("MT_SUMMARY "):]) + if proc.returncode != 0 or summary is None or "error" in summary: + sys.stderr.write((proc.stdout or "")[-2000:] + "\n" + + (proc.stderr or "")[-2000:] + "\n") + err = summary["error"] if summary and "error" in summary else script + sys.exit("Blender 执行失败:%s" % err) + return summary