修复 Windows 编码问题导致生成失败
Windows 默认编码为 GBK,Python stdout 输出含中文的 JSON 时 Node.js 端无法正确解析,导致批量生成操作静默失败。 - python/main.py:启动时强制 stdin/stdout 使用 UTF-8 - templateIpc.js:spawn 传入 PYTHONUTF8=1,改用 Buffer 拼接后 UTF-8 解码 Co-Authored-By: Claude Sonnet 4.6 <noreply@anthropic.com>
This commit is contained in:
parent
a4d1218d21
commit
6b2c87dc18
@ -18,16 +18,19 @@ const PYTHON_BIN = app.isPackaged
|
|||||||
function callPython(payload) {
|
function callPython(payload) {
|
||||||
return new Promise((resolve, reject) => {
|
return new Promise((resolve, reject) => {
|
||||||
const isPackaged = app.isPackaged;
|
const isPackaged = app.isPackaged;
|
||||||
|
// PYTHONUTF8=1 确保 Windows 上 Python 使用 UTF-8 编码
|
||||||
|
const spawnEnv = { ...process.env, PYTHONUTF8: "1" };
|
||||||
const proc = isPackaged
|
const proc = isPackaged
|
||||||
? spawn(PYTHON_BIN)
|
? spawn(PYTHON_BIN, [], { env: spawnEnv })
|
||||||
: spawn(process.env.PYTHON_PATH || "python3", [PYTHON_BIN]);
|
: spawn(process.env.PYTHON_PATH || "python3", [PYTHON_BIN], { env: spawnEnv });
|
||||||
|
|
||||||
let stdout = "";
|
const chunks = [];
|
||||||
proc.stdout.on("data", (d) => (stdout += d));
|
proc.stdout.on("data", (d) => chunks.push(d));
|
||||||
proc.stderr.on("data", (d) => console.error("[python]", d.toString()));
|
proc.stderr.on("data", (d) => console.error("[python]", d.toString("utf8")));
|
||||||
proc.on("close", () => {
|
proc.on("close", () => {
|
||||||
|
const stdout = Buffer.concat(chunks).toString("utf8").trim();
|
||||||
try {
|
try {
|
||||||
resolve(JSON.parse(stdout.trim()));
|
resolve(JSON.parse(stdout));
|
||||||
} catch (e) {
|
} catch (e) {
|
||||||
reject(new Error("Python 返回了无效 JSON: " + stdout));
|
reject(new Error("Python 返回了无效 JSON: " + stdout));
|
||||||
}
|
}
|
||||||
|
|||||||
@ -1,5 +1,10 @@
|
|||||||
import sys
|
import sys
|
||||||
import json
|
import json
|
||||||
|
import io
|
||||||
|
|
||||||
|
# Windows 默认编码不是 UTF-8,强制设置
|
||||||
|
sys.stdin = io.TextIOWrapper(sys.stdin.buffer, encoding="utf-8")
|
||||||
|
sys.stdout = io.TextIOWrapper(sys.stdout.buffer, encoding="utf-8", line_buffering=True)
|
||||||
|
|
||||||
def main():
|
def main():
|
||||||
for line in sys.stdin:
|
for line in sys.stdin:
|
||||||
|
|||||||
Loading…
x
Reference in New Issue
Block a user