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

如何让Node.js等待Python子进程执行完毕后再继续执行?

解决JavaScript中等待Python子进程执行完毕的问题

你遇到的核心问题是:Node.js的child_process.spawn是异步操作,当前代码没有等待子进程执行完成就继续执行了后续逻辑,导致输出顺序不符合预期。要实现等待子进程结束后再执行后续代码,只需要把Spawn的执行逻辑封装成Promise,再用await等待这个Promise完成即可。

修改后的JavaScript代码

async function runPythonScript() {
    return new Promise((resolve, reject) => {
        const spawn = require('child_process').spawn;
        const py = spawn('python', ['main.py']);
        let dataString = '';

        // 捕获Python脚本的标准输出
        py.stdout.on('data', (data) => {
            dataString += data.toString();
        });

        // 子进程输出结束时,返回捕获到的内容
        py.stdout.on('end', () => {
            resolve(dataString);
        });

        // 捕获子进程的错误信息
        py.stderr.on('data', (err) => {
            reject(new Error(err.toString()));
        });

        py.stdin.write(JSON.stringify([]));
        py.stdin.end();
    });
}

async function main() {
    console.log("J: Hey...")
    console.log("J: I can't count to 5...")
    console.log("J: Can you help me, Mr. Python?")

    try {
        // 等待Python脚本执行完成并获取输出
        const pythonOutput = await runPythonScript();
        console.log(pythonOutput);
    } catch (error) {
        console.error('执行Python脚本时出错:', error);
    }

    console.log("J: Thank you, mister!")
}

main()

Python代码(无需修改)

def main():
    print("P: Of course!")
    print("P: It's like this:")
    for i in range(5): print(f"P: {i + 1}")
    print("P: Hope that it helps!")

if __name__ == "__main__":
    main()

关键说明

  1. Promise封装:将子进程的创建、输出捕获、结束监听逻辑放在Promise内部,当子进程输出结束(end事件触发)时调用resolve返回结果;如果子进程出错(stderr有输出)则调用reject抛出错误。
  2. await等待:在main函数中用await调用runPythonScript(),这会暂停main函数的执行,直到Promise完成(子进程执行结束),之后才会执行后续的console.log("J: Thank you, mister!")。
  3. 错误处理:用try-catch包裹await调用,捕获Python脚本执行过程中可能出现的错误,避免程序崩溃。

这样修改后,执行顺序就会和你期望的一致:先打印JavaScript的请求内容,再打印Python的输出,最后打印JavaScript的感谢语句。

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.08.04 10:55:21