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

Node.js调用Python文件触发ERR_UNHANDLED_REJECTION错误的解决方法

修复Node.js调用Python脚本时的未处理Promise拒绝错误

原问题代码

const { exec } = require("child_process");

const executePy = (filepath) => {
  return new Promise((resolve, reject) => {
    exec(
      `python ${filepath}`,
      (error, stdout, stderr) => {
        error && reject({ error, stderr });
        stderr && reject(stderr);
        resolve(stdout);
      }
    );
  });
};

触发的错误信息

node:internal/process/promises:279
            triggerUncaughtException(err, true /* fromPromise */);
            ^

[UnhandledPromiseRejection: This error originated either by throwing inside of an async function without a catch block, or by rejecting a promise which was not handled with .catch(). The promise rejected with the reason "#<Object>".] {
  code: 'ERR_UNHANDLED_REJECTION'
}

修复后的完整实现

const { exec } = require("child_process");

const executePy = (filepath) => {
  return new Promise((resolve, reject) => {
    // 兼容不同系统的Python命令,Windows优先用python,类Unix优先用python3
    const cmd = process.platform === "win32" 
      ? `python "${filepath}"` 
      : `python3 "${filepath}" || python "${filepath}"`;
    
    exec(cmd, (error, stdout, stderr) => {
      // 优先处理执行层面的错误(如找不到Python、脚本不存在等)
      if (error) {
        return reject({
          type: "execution_error",
          message: error.message,
          details: stderr.trim()
        });
      }

      // 处理脚本输出的错误信息,若仅为警告可改为返回stdout+stderr而非reject
      if (stderr) {
        return reject({
          type: "script_error",
          error_msg: stderr.trim()
        });
      }

      // 返回清理后的标准输出
      resolve(stdout.trim());
    });
  });
};

// 正确调用示例(必须处理Promise的reject分支)
async function runPythonScript(filepath) {
  try {
    const result = await executePy(filepath);
    console.log("脚本执行结果:", result);
    return result;
  } catch (err) {
    console.error("执行失败:", err);
    // 可在此添加错误上报、重试等逻辑
    throw err;
  }
}

// 调用示例
runPythonScript("./your_script.py");

关键修复点说明

  1. 处理未捕获的Promise拒绝:
    调用executePy时必须通过try/catch(async函数内)或.catch()(链式调用)捕获reject,避免触发未处理拒绝错误。

  2. 规避命令注入与路径问题:
    将文件路径用双引号包裹,防止路径含空格/特殊字符时执行异常;同时兼容Windows和类Unix系统的Python命令差异。

  3. 优化错误判断逻辑:
    用return终止后续代码执行,避免Promise被多次调用(原代码reject后仍会执行resolve,存在逻辑漏洞);区分执行层面错误和脚本自身输出的错误信息,提升调试效率。

  4. 输出内容清理:
    对stdout和stderr执行trim(),去除多余换行和空白字符,让输出更整洁。

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.08.10 10:11:35